创建(ES6)承诺而不开始解决它 [英] Creating a (ES6) promise without starting to resolve it

查看:136
本文介绍了创建(ES6)承诺而不开始解决它的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用ES6承诺,如何在不定义解析逻辑的情况下创建承诺?这是一个基本的例子(一些TypeScript):

Using ES6 promises, how do I create a promise without defining the logic for resolving it? Here's a basic example (some TypeScript):

var promises = {};
function waitFor(key: string): Promise<any> {
  if (key in promises) {
    return promises[key];
  }
  var promise = new Promise(resolve => {
    // But I don't want to try resolving anything here :(
  });

  promises[key] = promise;
  return promise;
}

function resolveWith(key: string, value: any): void {
  promises[key].resolve(value); // Not valid :(
}

这是很容易用其他的promise库完成.JQuery的例子:

It's easily done with other promise libraries. JQuery's for example:

var deferreds = {};
function waitFor(key: string): Promise<any> {
  if (key in promises) {
    return deferreds[key].promise();
  }
  var def = $.Deferred();    
  deferreds[key] = def;
  return def.promise();
}

function resolveWith(key: string, value: any): void {
  deferreds[key].resolve(value);
}

我能看到的唯一方法是将解析函数存储在pr中的某个位置omise的执行者,但这看起来很混乱,我不确定它是在运行这个函数时定义的 - 它是否总是在构造时立即运行?

The only way I can see to do this would be to store the resolve function away somewhere within the promise's executor but that seems messy, and I'm not sure it's defined when exactly this function is run - is it always run immediately on construction?

谢谢。

推荐答案

好问题!

传递给promise构造函数的解析器故意运行同步以支持此用例:

The resolver passed to the promise constructor intentionally runs synchronous in order to support this use case:

var deferreds = [];
var p = new Promise(function(resolve, reject){
    deferreds.push({resolve: resolve, reject: reject});
});

然后,在稍后的某个时间点:

Then, at some later point in time:

 deferreds[0].resolve("Hello"); // resolve the promise with "Hello"

给出构造函数的原因是:

The reason the promise constructor is given is that:


  • 通常(但不总是)解析逻辑绑定到创建。

  • promise构造函数是throw安全并将异常转换为拒绝。

有时它不适合,并且旋转变压器同步运行。 以下是有关该主题的相关阅读

Sometimes it doesn't fit and for that it the resolver runs synchronously. Here is related reading on the topic.

这篇关于创建(ES6)承诺而不开始解决它的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆