等同于'Promise.resolve()。then()'?

时间:2017-07-13 11:55:02

标签: javascript promise async-await

我对Promises很熟悉,但继承了一些非常不寻常的代码,而不是让new Promise()使用构造函数的方法:

Promise.resolve().then(
  function() {
    // Do useful things
  }
)

从我的研究中,这是一个weird version of setImmediate - 即,在下一个刻度线上运行以下函数。

await版本的内容是什么?

3 个答案:

答案 0 :(得分:8)

Promise.resolve()可能有两个不同的原因。你碰到了其中一个:

推迟到JS事件循环的当前运行结束

这里显而易见的答案是await Promise.resolve();

await undefined隐含地做同样的事情,但为什么不明确?

奇异错误处理

Promise.resolve()经常出现在单一错误处理的承诺链的头部:



const doSomething = x => new Promise(r => setTimeout(() => r(x), 1000));

Promise.resolve()
.then(() => doSomething(""())) // bug!
.then(() => doSomething("else"))
.catch(e => console.log("Got " + e)); // Got TypeError: "" is not a function




没有它,第一步可能会引发异常,这可能是意外的!



const doSomething = x => new Promise(r => setTimeout(() => r(x), 1000));

doSomething(""()) // bug!
.then(() => doSomething("else"))
.catch(e => console.log("Got " + e)); // uncaught!




答案是,您不再需要使用async / await进行Promise.resolve()序言。

async函数隐式捕获同步异常并返回被拒绝的promise,保证单一错误处理和promise返回值:



const doSomething = x => new Promise(r => setTimeout(() => r(x), 1000));

(async () => {
  await doSomething(""()); // bug!
  await doSomething("else");
})().catch(e => console.log("Got " + e)); // Got TypeError: "" is not a function




这不仅是一个很好的不变量而且输入更少,与Promise.resolve() kludge不同,它实际上仍然同步调用doSomething



function doSomething() {
  console.log("doSomething() called");
  ""() // bug!
  return new Promise(r => setTimeout(() => r(x), 1000));
}

(async () => {
  await doSomething();
  await doSomething("else");
})().catch(e => console.log("Got " + e)); // Got TypeError: "" is not a function

console.log("here");




任何其他方式都很难实现。 async / await的另一个原因很棒!

答案 1 :(得分:4)

  

我继承了一些非常不寻常的代码,而不是让new Promise()使用Promise.resolve().then(…)。根据我的研究,这是setImmediate的一个奇怪的版本 - 即,在下一个刻度上运行以下函数。

这是副作用,但可能不是此构造的预期目的。重点是"有用的代码"在then回调中throw - 安全且可以轻松地return普通价值和承诺,启动通常的承诺链。它 也可以用new Promise编写,但这需要使用resolve来代替通常的return

  

这个版本的await是什么?

从字面上看,await Promise.resolve();(可以缩短为等效的await;语句)。但是,如果仅出于错误处理的目的(很可能),只需省略它。 async function默认情况下会将异常转换为拒绝。

答案 2 :(得分:2)

只需await

如果你给await一个不是诺言的表达,它的行为就像

await Promise.resolve(<nonPromiseExpression>)

因此await undefined将导致异步函数的其余部分异步执行。以setImmediate的这两个实现为例:

&#13;
&#13;
var setImmediate = function (fn) {
  Promise.resolve().then(fn);
};

console.log('A');
setImmediate(function () {
  console.log('E');
});
console.log('B');

setImmediate = async function (fn) {
  await undefined;
  fn();
};

console.log('C');
setImmediate(function () {
  console.log('F');
});
console.log('D');
&#13;
&#13;
&#13;