javascript - 如何在javascript中将异步调用与同步调用结合起来

标签 javascript

我有点开始学习 javascript 并且有一个关于组契约(Contract)步和异步函数调用的问题。这将只是一个理论问题,但我希望它能传递思想。

假设我们有一个 javascript 程序来决定我需要购买多少香蕉和橙子。

console.log('buy %d bananas and %d oranges', bananas, oranges)

现在,我可以决定我能买多少香蕉,但我需要问我妻子她想要多少橘子,所以我给她发了短信。 (我可以写一个异步函数来表示这个)。

这将是我的直接方法:

var bananas = 10;
var oranges = 0;
textWife('askAboutOranges',function(number){ oranges = number; }
console.log('buy %d bananas and %d oranges', bananas, oranges)

但对我来说这没有意义,因为我必须等待我妻子的回复,所以我可能无法及时得到橙子的数量。

所以我可以将我的程序更改为:

var bananas = 10;
var oranges = 0;
textWife('askAboutOranges',function(number){ 
   oranges = number;
   console.log('buy %d bananas and %d oranges', bananas, oranges); 
}

但我不喜欢这样,因为现在我有根据我妻子的回复来决定买什么(包括香蕉)的逻辑。如果我决定不想要橘子怎么办,我是否必须这样做:

var bananas = 10;
var oranges = 0;
if (wantOranges)
{
  textWife('askAboutOranges',function(number){ 
   oranges = number;
   console.log('buy %d bananas and %d oranges', bananas, oranges); 
  }
}
else 
  console.log('buy %d bananas and %d oranges', bananas, oranges); 

所以我的问题是,任何人都可以向我解释执行此类操作的最佳/正确方法是什么吗?

最佳答案

jQuery Deferred是随身携带的好工具。我可能会做这样的事情来分离关注点:

function decideHowManyBananas() {
    return 10;
}

function decideHowManyOranges() {
    var deferred = $.Deferred();

    if (wantOranges) {
        textWife('askAboutOranges', function(number) { 
            deferred.resolve(number);
        });
    } else {
        deferred.resolve(0);
    }

    return deferred.promise();
}

$.when(decideHowManyBananas(), decideHowManyOranges()).done(function(bananas, oranges) {
    console.log('buy %d bananas and %d oranges', bananas, oranges);
});

关于javascript - 如何在javascript中将异步调用与同步调用结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559207/

相关文章:

javascript - 搜索带有子项的整个 javascript 对象

javascript - 在没有构建过程的情况下使用 Browserify 运行脚本

javascript - 需要这个正则表达式不需要至少1个大写字母

语法

javascript - 旋转时反转滚动(180d)

javascript - ExtJS Store reader.read 未找到

javascript - 为什么这个 chai-as-promised AssertionError 打印到控制台而不是我的 Mocha 测试运行程序?

javascript - 在web中显示java servlet进程

javascript - 释放 Javascript 中未附加的 DOM 节点使用的内存

javascript - 双星号 ** 是有效的 JavaScript 运算符吗?