Promise.all没有回来

Nod*_*rat 1 javascript promise ecmascript-6 es6-promise

我一直试图让Promise.all在Promise列表中没有成功,所以相反只用一个promise的数组来尝试它,我得到同样的问题:

  let tasks = [];
  tasks.push(function(resolve, reject){
    superagent
    .post(URL_ROOT + url_path)
    .send(data)
    .end(function(err, res){
          if(err)
            reject(err);

          assert.equal(res.status, status.UNAUTHORIZED); //401
          console.log('Promise completed successfully');
          resolve();
    });
  });


Promise.all([
  new Promise(tasks[0])
]).then( function(){
  console.log("Done");
  done();
})
.catch( function(reason){
  throw new Error(reason);
});
Run Code Online (Sandbox Code Playgroud)

"承诺成功完成"打印得很好,但它只是挂起,"完成"永远不会打印.

任何帮助将非常感激.

Tam*_*dus 5

查看节点处理程序:

.end(function(err, res){
      if(err)
        reject(err);

      assert.equal(res.status, status.UNAUTHORIZED); //401
      console.log('Promise completed successfully');
      resolve();
});
Run Code Online (Sandbox Code Playgroud)

这将调用两者reject并且resolve如果有错误(并且断言成功).我怀疑你的情况,所以承诺被拒绝(因为在解决之前调用拒绝),代码继续并打印Promise completed successfully.

在那之后,promise链会进入拒绝处理程序:

.catch( function(reason){
  throw new Error(reason);
});
Run Code Online (Sandbox Code Playgroud)

但是这段代码没有做任何事情,因为投入一个承诺延续将转化为对最终承诺的拒绝,这个承诺在这里被遗忘.

尝试以下方法验证我的理论,看看它是否记录:

.catch( function(reason){
  console.log("Promise rejected");
  throw new Error(reason);
});
Run Code Online (Sandbox Code Playgroud)

要解决这个问题,您所要做的就是重新构建代码:

.end(function(err, res){
  if(err) {
    reject(err);
  } else {
    resolve();
    assert.equal(res.status, status.UNAUTHORIZED); //401
    console.log('Promise completed successfully');
  }
});
Run Code Online (Sandbox Code Playgroud)

因此,您已将异步任务转换为正确的promise(可能必须处理.on("error", reason => reject(reason))),并在catch子句中放入错误处理程序.

如果您仍想将错误传递给全局错误处理程序,那么您可以做的最好是在a中执行此操作setTimeout,因此promise回调无法捕获并转换错误:

.catch( function(reason) {
  setTimeout(() => {
    throw new Error(reason);
  }, 0);
});
Run Code Online (Sandbox Code Playgroud)