如何在javascript中将异步调用与同步相结合

前端之家收集整理的这篇文章主要介绍了如何在javascript中将异步调用与同步相结合前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有点开始学习 javascript并且有关于将同步和异步调用组合到函数的问题.这只是一个理论问题,但我希望它传达这个想法.

我们假设我们有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',oranges)

但对我来说这没有意义,因为我必须等待我的妻子回复,所以我可能不会及时获得橘子的数量.

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

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

但我不喜欢这个,因为现在我有了决定买什么的逻辑,包括香蕉,在我妻子的回应中.如果我决定不想要橘子,我必须做这样的事情:

var bananas = 10;
var oranges = 0;
if (wantOranges)
{
  textWife('askAboutOranges',oranges); 
  }
}
else 
  console.log('buy %d bananas and %d oranges',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',oranges);
});

猜你在找的JavaScript相关文章