Javascript 应该由Promise调用同步代码。然后创建一个新的Promise

Javascript 应该由Promise调用同步代码。然后创建一个新的Promise,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我已经实现了一些代码,其中异步代码后面跟着一些同步函数。例如: function processSomeAsyncData() { asyncFuncCall() .then(syncFunction) .catch(error); } 如果我理解正确,那么也是一种承诺。那么,我是否也应该在同步代码中创建承诺 function syncFunction() { const p = new Promise (function (resolve, reject) {

我已经实现了一些代码,其中异步代码后面跟着一些同步函数。例如:

function processSomeAsyncData() {
  asyncFuncCall()
    .then(syncFunction)
    .catch(error);
}
如果我理解正确,那么也是一种承诺。那么,我是否也应该在同步代码中创建承诺

function syncFunction() {
  const p = new Promise (function (resolve, reject) {
    //Do some sync stuff
    ...
    resolve(data);
  }
  return p;
}
如果没有必要,那么在发生错误时,如何拒绝同步代码的承诺?

这是可选的

如果从
syncFunction
返回承诺,则只有在新承诺解析后,原始承诺才会解析,并且新承诺返回的任何值都将传递给链中的下一个
然后

如果返回非承诺值,则该值将传递给链中的下一个
,然后是


要从
syncFunction
中拒绝,只需抛出一个异常。

您不需要显式创建新承诺。有一个更简单的方法

这个示例是人为设计的,因为它永远不会失败,但关键是您不必创建承诺,也不必返回解析(val)

这将有助于:

asyncFunction()
  .then(syncFunction);
但如果你用另一种方式:

syncFunction()
  .then(asyncFunction);
您必须将syncFunction定义为:

function syncFunction() {

  var j = "hi"
  return new Promise((resolve, reject) => {
    if(j){
      return resolve(j);
    }
    return reject('error');
  })  
}
编辑:为了向所有非信徒证明这一点,请在您的计算机上本地给这家伙一次机会。证明您有这么多可用的选项。:)


不可以。同步函数可以从同步代码调用,并且应该始终同步失败!它们不需要以任何方式符合异步调用方。如果发生错误,就抛出一个错误。试试看:

var asyncFuncCall=()=>Promise.resolve();
函数syncFunction(){
抛出新错误(“失败”);
}
asyncFuncCall()
.then(同步功能)

.catch(e=>console.log(“catch:+e.message”)
在第二个示例中,不需要使用
new Promise
Promise.resolve
Promise.reject
函数。在第一位代码中,返回承诺或值肯定不允许使用
链接。然后,
。我正在计算机上进行本地快速测试以证明这一点。给我一点时间。:)@nils是的,从
然后从
处理程序返回非承诺值是完全有效的。请参阅:“从OnCompleted或onRejected回调函数返回的值将自动包装在已解析的承诺中”。同步函数应该抛出错误,而不是返回已拒绝的承诺!异常会在
内部转换为拒绝。然后
仍会运行,因此永远不需要以这种方式容纳异步调用方。同步函数可以从同步代码调用,并且应该同步失败。封装规则。如果
syncFunction
返回承诺,则应将其重命名为
asyncffunction
function syncFunction() {

  var j = "hi"
  return new Promise((resolve, reject) => {
    if(j){
      return resolve(j);
    }
    return reject('error');
  })  
}
var Promise = require('bluebird');


function b(h) {
    if(h){
        return h;
    }
    return Promise.resolve('hello from b');
}

function a(z) {
    return new Promise((resolve, reject)=> {
        if(z){return resolve(z)};
        return resolve('hello from a');
    })
}

a().then(b).then(x => console.log(x)).catch(e => console.log(e));
b().then(a).then(x => console.log(x)).catch(e => console.log(e));