在 Promise 构造函数范围之外解析 Javascript Promise

2022-08-29 23:19:05

我一直在使用ES6 Promise。

通常,承诺是这样构造和使用的。

new Promise(function(resolve, reject){
    if (someCondition){
        resolve();
    } else {
        reject();
    } 
});

但是我一直在做一些类似下面的事情,为了灵活性而把决心带到外面。

var outsideResolve;
var outsideReject;
new Promise(function(resolve, reject) { 
    outsideResolve = resolve; 
    outsideReject = reject; 
});

以及后来的

onClick = function(){
    outsideResolve();
}

这工作正常,但是有没有更简单的方法可以做到这一点?如果不是,这是一种好的做法吗?


答案 1

简单:

var promiseResolve, promiseReject;

var promise = new Promise(function(resolve, reject){
  promiseResolve = resolve;
  promiseReject = reject;
});

promiseResolve();

答案 2

对于这里的聚会来说有点晚了,但另一种方法是使用延迟对象。您基本上拥有相同数量的样板,但是如果您想传递它们并可能在它们的定义之外解决,这将很方便。

朴素的实施:

class Deferred {
  constructor() {
    this.promise = new Promise((resolve, reject)=> {
      this.reject = reject
      this.resolve = resolve
    })
  }
}

function asyncAction() {
  var dfd = new Deferred()

  setTimeout(()=> {
    dfd.resolve(42)
  }, 500)

  return dfd.promise
}

asyncAction().then(result => {
  console.log(result) // 42
})

ES5 版本:

function Deferred() {
  var self = this;
  this.promise = new Promise(function(resolve, reject) {
    self.reject = reject
    self.resolve = resolve
  })
}

function asyncAction() {
  var dfd = new Deferred()

  setTimeout(function() {
    dfd.resolve(42)
  }, 500)

  return dfd.promise
}

asyncAction().then(function(result) {
  console.log(result) // 42
})