Javascript 我保证,一切都不会回来

Javascript 我保证,一切都不会回来,javascript,promise,ecmascript-6,es6-promise,Javascript,Promise,Ecmascript 6,Es6 Promise,我一直在尝试获得承诺。所有的承诺都没有成功,所以我尝试了一系列的承诺,但我得到了同样的问题: let tasks = []; tasks.push(function(resolve, reject){ superagent .post(URL_ROOT + url_path) .send(data) .end(function(err, res){ if(err) reject(err);

我一直在尝试获得承诺。所有的承诺都没有成功,所以我尝试了一系列的承诺,但我得到了同样的问题:

  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);
});
“Promise completed successfully”打印得很好,但它只是挂起,“Done”从未打印过


非常感谢您的帮助。

查看节点处理程序:

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

      assert.equal(res.status, status.UNAUTHORIZED); //401
      console.log('Promise completed successfully');
      resolve();
});
如果出现错误(且评估成功),这将同时调用
拒绝
解决
。我怀疑在您的情况下会出现这种情况,因此承诺会被拒绝(因为在解析之前会调用拒绝),代码将继续并打印
成功完成的承诺

之后,承诺链运行到拒绝处理程序:

.catch( function(reason){
  throw new Error(reason);
});
但是这段代码没有做任何事情,因为抛出一个承诺延续将转化为结果承诺中的拒绝,这个承诺在这里被遗忘了

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

.catch( function(reason){
  console.log("Promise rejected");
  throw new Error(reason);
});
要解决此问题,您所要做的就是稍微重新构造代码:

.end(function(err, res){
  if(err) {
    reject(err);
  } else {
    resolve();
    assert.equal(res.status, status.UNAUTHORIZED); //401
    console.log('Promise completed successfully');
  }
});
因此,您已经将异步任务转换为适当的承诺(可能还必须处理
.on(“error”,reason=>reject(reason))
),并在catch子句中放置一个错误处理程序

如果仍要将错误传递给全局错误处理程序,最好在
setTimeout
中执行此操作,以便promise回调无法捕获和转换错误:

.catch( function(reason) {
  setTimeout(() => {
    throw new Error(reason);
  }, 0);
});

查看节点处理程序:

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

      assert.equal(res.status, status.UNAUTHORIZED); //401
      console.log('Promise completed successfully');
      resolve();
});
如果出现错误(且评估成功),这将同时调用
拒绝
解决
。我怀疑在您的情况下会出现这种情况,因此承诺会被拒绝(因为在解析之前会调用拒绝),代码将继续并打印
成功完成的承诺

之后,承诺链运行到拒绝处理程序:

.catch( function(reason){
  throw new Error(reason);
});
但是这段代码没有做任何事情,因为抛出一个承诺延续将转化为结果承诺中的拒绝,这个承诺在这里被遗忘了

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

.catch( function(reason){
  console.log("Promise rejected");
  throw new Error(reason);
});
要解决此问题,您所要做的就是稍微重新构造代码:

.end(function(err, res){
  if(err) {
    reject(err);
  } else {
    resolve();
    assert.equal(res.status, status.UNAUTHORIZED); //401
    console.log('Promise completed successfully');
  }
});
因此,您已经将异步任务转换为适当的承诺(可能还必须处理
.on(“error”,reason=>reject(reason))
),并在catch子句中放置一个错误处理程序

如果仍要将错误传递给全局错误处理程序,最好在
setTimeout
中执行此操作,以便promise回调无法捕获和转换错误:

.catch( function(reason) {
  setTimeout(() => {
    throw new Error(reason);
  }, 0);
});

这没有道理。如果打印了“Promise completed successfully”,那么也应该打印“Done”。请注意,如果您的断言抛出,您的承诺将永远不会被拒绝,
catch
回调毫无意义(它可能会调用
Done
并出现错误)@Bergi我必须承认我不会像这样列出我的承诺,并将承诺直接添加到任务数组中。但是OP说他得到了
“承诺成功完成”
,所以断言虽然错了,但这里不可能是问题所在,因为resolve肯定也会受到打击。去掉超级药剂对我来说确实有用。OP是否可能使用了某些特定的Promise库,但这些库工作不正常?@Keith是的,断言不是问题的原因,我只是想指出它是错误的。事实上,最好将承诺本身放在
任务
数组中,这没有意义。如果打印了“Promise completed successfully”,那么也应该打印“Done”。请注意,如果您的断言抛出,您的承诺将永远不会被拒绝,
catch
回调毫无意义(它可能会调用
Done
并出现错误)@Bergi我必须承认我不会像这样列出我的承诺,并将承诺直接添加到任务数组中。但是OP说他得到了
“承诺成功完成”
,所以断言虽然错了,但这里不可能是问题所在,因为resolve肯定也会受到打击。去掉超级药剂对我来说确实有用。OP是否可能使用了某些特定的Promise库,但这些库工作不正常?@Keith是的,断言不是问题的原因,我只是想指出它是错误的。事实上,最好将承诺本身放在
任务
数组中。啊,谢谢,它现在可以工作了:)我没有意识到拒绝后会继续执行,或者如果未经授权,err不为null。此外,断言和日志应该放在
然后
处理程序中,不在解析器回调中。Crikey昨天有一个,有人假设一个reject(),使函数短路。另一个选项当然是
if(err)return-reject(err)我知道这是个人偏好,只是它可以防止大量的if-then-else缩进。啊,谢谢,它现在可以工作了:)我没有意识到拒绝后会继续执行,或者如果未经授权,err不为null。此外,断言和日志应该放在
then
处理程序中,不在解析器回调中。Crikey昨天有一个,有人假设一个reject(),使函数短路。另一个选项当然是
if(err)return-reject(err)我知道这是个人偏好,只是它防止了大量的if-then-else缩进。