【问题标题】:async promises in javascript q libraryjavascript q 库中的异步承诺
【发布时间】:2014-10-25 01:11:15
【问题描述】:

我有一个在线教程中的示例,我想知道如何将每个 then 转换为异步调用?

Edit-基本上我希望承诺以异步方式进行每个调用,或者它如何在那里工作。我是 Promise 的新手,一个 Promise 意味着单个异步调用,或者一个 Promise 可以有多个异步调用,然后在最后回调,

如果我有以下三个函数调用,我如何将它们链接为异步,现在它们都按顺序立即触发?

编辑 2 - 在 Joel 的支持下根据学习改进了我的问题,我现在有一个小提琴 http://jsfiddle.net/smartdev101/eLxxpjp3/

var q = require('q');
        var defer = q.defer();
        defer.promise
        .then(function(weapon){
            setTimeout(function(){console.log('wait')}, 2000);
            console.log("You can have my " + weapon);
            return "bow";
        })
        .then(function(weapon){
            console.log("and my " + weapon);
            return "axe";
        })
        .then(function(weapon){
            console.log("and my " + weapon);
        });

        defer.resolve("sword");

【问题讨论】:

  • 您必须更具体地说明何时尝试完成。试着用文字来准确地解释你想要什么时候运行各种事情。我希望你意识到setTimeout() 只是在未来的某个时间安排一个回调——它不会延迟下一行代码的运行。
  • 编辑了我的问题...
  • 在 Javascript 中,您不能只将函数调用转换为异步。给定的操作要么是同步的,要么是异步的。除了setTimeout(),您的所有操作都是同步的。如果要使同步操作以异步方式运行,可以将其隐藏在setTimeout() 后面,但您必须为每个操作添加一个 setTimeout()。这真的是你想做的吗?如果是这样,您希望每次操作延迟多少?
  • Promise 不会产生异步代码,它们用于处理现有的异步调用(例如 IO)。您必须记住 javascript 是单线程的,因此您的代码将一次性执行,即使使用 Promise 也是如此。如果你想在调用之间引入任意延迟,你可以在每个 Promise 链中调用一个 setTimeout。
  • 上面的代码可能不是正确的例子,而且我对 Promise 很陌生,但我希望按顺序异步调用一些异步过程,比如说调用服务(异步),获取数据,解析结果,然后插入数据库(再次异步),然后通过最终回调通知,promise 可以做到吗?如果那么在上述情况下如何将一个异步调用的结果提供给下一个

标签: javascript node.js angular-promise


【解决方案1】:

也许这应该给你所期望的(虽然我不确定你所期望的):

var q = require('q');

function waitAndSpeak(words) {
    var defer = q.defer();
    setTimeout(function(){
        defer.resolve(words)
    }, 2000);
    return defer.promise;
}

waitAndSpeak("sword").then(function(weapon) {
    console.log("You can have my " + weapon);
    return waitAndSpeak("bow");
}).then(function(weapon) {
    console.log("and my " + weapon);
    return waitAndSpeak("axe");
}).then(function(weapon) {
    console.log("and my " + weapon);
}).done();

【讨论】:

  • hmmm close,乔尔,这似乎是一个,然后我基本上会在其中放置 http 服务调用,最后会返回它的样子
  • 这里的重点在于方法waitAndSpeak:deferred只有在方法返回后才被解析。这样它就可以模拟异步调用。
  • 好的,我可以为每个后续的 thenables 设置不同的内容,例如 waitAndSpeak1、waitAndSpeak2、waitAndSpeak3,我会尽快发布一个提琴手供您审核,然后接受您的回答。
  • 感谢 Joel 对我的示例的支持,有时对某事不熟悉会使您难以描述您正在寻找的内容,以及在我的环境中工作方式的一些限制,请查看此小提琴,我需要你的更多帮助,希望这会让它更清楚。 jsfiddle.net/smartdev101/eLxxpjp3
  • 你现在可以看看这个stackoverflow.com/questions/26553098/…
猜你喜欢
  • 2014-01-04
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2015-02-25
  • 1970-01-01
  • 2015-05-12
  • 2018-03-02
相关资源
最近更新 更多