【问题标题】:JavaScript, Promises coexisting with callbacksJavaScript,Promises 与回调共存
【发布时间】:2016-01-04 05:25:30
【问题描述】:

如何改进下面的第三个函数以同时使用基于回调的函数和基于 Promises 的函数?

第一个函数是“times 2”的标准回调实现。

function a(i, cb) {
  return cb(null, i * 2);
}

let ans = 
  a(2,
    function(error, result) {
      if (error) console.log('a callback error ' + error.message);
      return result;
    }
  );
console.log('a(2, cb)=' + ans);

到达

a(2, cb)=4

我的第二个函数将 Promises 用于“time 3”。

function ap(i) {
  return new Promise(function(resolve, reject) {
    return resolve(i * 3); 
  })
}

ap(2)
.then(function(result, error) {
  if (error) console.log('error ' + error.message);
  console.log('ap(2)=' + result);
});

到达

ap(2)=6

这个问题的动机是一段代码,我似乎无法让语句以正确的顺序出现。我正在尝试使用第三个函数来学习如何使带有回调的函数与带有 Promises 的函数共存。第一次尝试调用上面的回调函数,然后链接上面的 Promise 函数。

let ans;
function aap(i) {
  let answer = a(i, function(error, result) {
    if (error) console.log('error ' + error.message);
    return result;
  });
  ap(answer)
  .then(function(result, error) {
    console.log('aap ap callback   result=' + result + '   error=' + error);
    if (error) console.log('error ' + error.message);
    ans = result;
  })
}

aap(2);
console.log('aap(2)=' + ans);

它同时到达

aap(2)=null
aap ap callback   result=12   error=undefined

第一行看起来很失败。我从第二行看到,如果我能更有效地控制语句顺序,就可以获得正确的答案。怎么样?

【问题讨论】:

  • 你的第三个函数有很多问题——主要是你对异步编码技术缺乏了解
  • 你在拐弯抹角。请清楚说明实际问题。
  • 我试图学习其他人正在使用的技术(如果有的话),以使用回调函数和使用 Promises 的函数。正确答案在我提供的示例中,但我无法控制语句执行的顺序,这阻止了我在程序中使用该答案。
  • 我承认我对异步编码技术缺乏了解。一些 StackOverflow 版主似乎认为,我要求提供有关资源的建议以解释该材料是对 StackOverflow 的不当使用,因此我制定了一个示例,希望它能为我提供所需的帮助。我想按预期使用该网站;我寻求一些帮助。提前致谢。

标签: javascript callback


【解决方案1】:

尝试将error处理分离到.then()的第二个参数,从aap返回ap,将ans设置为let ans = aap(2)

function a(i, cb) {
  return cb(null, i * 2);
}

function ap(i) {
  return Promise.resolve(i * 3);
}

function aap(i) {
  let answer = a(i, function(error, result) {
    if (error) console.log("error " + error.message);
    return result;
  });
  return ap(answer)
    .then(function(result, error) {
      console.log("aap ap callback   result=" + result);
      return result;
    }, function(e) {
      if (e) console.log("e " + e.message);
      return e
    })
}

let ans = aap(2);

ans.then(function(res) {
  console.log(res);
  return res
}, function err(e) {
  console.log(e)
});

console.log(ans);

【讨论】:

  • 我喜欢这个解决方案。我注意到最后一行的结果首先发布,Promise { <pending> }。此时有没有办法让 ans 保持 res ?
  • @BaldEagle “有没有办法让 ans 在这一点上保持 res ?” ans 返回 Promise 已实现值 res , console.log(ans); 包括在答案中证明ans 被定义为Promise 对象
【解决方案2】:

@guest271314 很好地回答了这个问题。此外,他们为我提供了为后续问题创建有用答案所需的工具。我原来的帖子轻轻地暗示了一个后续问题;它会要求创建函数 apa(i) 的技术(它将首先调用 ap() 并将其链接到 a() (与上面提出的问题相反)。

这就是我得到的

function apa(i) {
  ap(i)
  .then(function(result, error) {
    if (error) console.log('error ' + error.message)
    else return a(result, function(error2, result2) {
      if (error2) console.log('error ' + error2.message)
      else console.log('apa(' + i + ')=' + result2);
    });
  });
}

apa(2);

到达

apa(2)=12

如果有人愿意发布更好的技术,以便在异步环境中将函数与回调和 Promises 混合在一起,我很乐意阅读它。通过演示,我得出结论是可以做到的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-31
    • 2019-01-14
    • 2019-09-28
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2017-01-08
    相关资源
    最近更新 更多