关于javascript异步功能的“待定”和“履行”承诺

时间:2018-04-06 12:54:31

标签: javascript asynchronous promise

async function pending() { 
  return new Promise((resolve, reject) => { resolve(1) });
}

async function fulfilled() {
  return 1;
}

function promiseState(p) {
   return Promise.race([ Promise.resolve(p).then(() => "fulfilled", () => "rejected"), Promise.resolve().then(() => "pending") ]);
}

promiseState(pending()).then(s => { console.log(s); });        // pending
promiseState(fulfilled()).then(s => { console.log(s); });      // fulfilled

pending().then(r => { console.log(r); });        // 1
fulfilled().then(r => { console.log(r); });      // 1

有什么不同?

我什么时候应该使用'返回新的Promise(...'在异步函数中?为什么?

2 个答案:

答案 0 :(得分:1)

之间的区别相同
function pending() { 
  return Promise.resolve(Promise.resolve(1));
}

function fulfilled() {
  return Promise.resolve(1);
}

前者只需要更长的时间来解决问题。

  

我什么时候应该使用'返回新的Promise(...'在异步函数中?

可能永远不会。请参阅How to turn this callback into a promise using async/await?What is the benefit of prepending async to a function that returns a promise?

答案 1 :(得分:0)

你不应该在另一个Promise或async函数中明确地构造Promise,即promise constructor antipattern。它只是增加了额外的开销,你无论如何都没有任何好处。如果你真的需要Promise构造函数(用于包装回调API),那么周围的函数不应该是async,只需返回promise。