Javascript 如何按顺序执行3个异步函数?

Javascript 如何按顺序执行3个异步函数?,javascript,Javascript,代码如下: adjust_geo = function(callback){Plasma.Hose('edge-to-sluice').Deposit({ "descrips": [ "sluice", "prot-spec v1.0", "request", "zoom" ], "ingests": { "lat":

代码如下:

adjust_geo = function(callback){Plasma.Hose('edge-to-sluice').Deposit({
          "descrips": [
            "sluice",
            "prot-spec v1.0",
            "request",
            "zoom"
          ],
          "ingests": {
            "lat": stickie.latitude,
            "lon": stickie.longitude,
            "level": stickie.zoom_level
          }
        });
        Plasma.Hose('edge-to-sluice').Deposit({
          "descrips": [
            "sluice",
            "prot-spec v1.0",
            "request",
            "set-time"
          ],
          "ingests": {
            "time": stickie.start,
            "rate": 2.0,
            "pause": false
          }
        });
        callback();
        }        

         var remove_stickies = function(callback){      
           Plasma.Hose('edge-to-sluice').Deposit({ descrips: ['sluice', 'prot-spec v1.0', 'request', 'remove-all-fluoro'], ingests : {}
        });
        callback();
        }   


        deposit_fluoros = function(){
        console.log(stickie.fluoroscopes);
        L = JSON.parse(stickie.fluoroscopes);
        console.log(L);
        for (var i = 1; i<L.length;i++){
                console.log(L[i]);                
                 Plasma.Hose('tcp://localhost/edge-to-sluice')
                        .Deposit({
                          "descrips": [
                            "sluice", 
                           "prot-spec v1.0",
                            "request",
                            "new-fluoro-instance"], 
                           "ingests":L[i] 
                       }); 
                };
          } 
          }  
     adjust_geo(remove_stickies(deposit_fluoros()));
adjust_geo=函数(回调){Plasma.hope('edge-to-slucte')。存款({
“描述”:[
“水闸”,
“保护规范v1.0”,
“请求”,
“缩放”
],
“摄入”:{
“纬度”:粘性纬度,
“lon”:粘滞的经度,
“级别”:粘滞。缩放\u级别
}
});
等离子软管(“边缘到水闸”)。沉积物({
“描述”:[
“水闸”,
“保护规范v1.0”,
“请求”,
“设定时间”
],
“摄入”:{
“时间”:stickie.start,
“利率”:2.0,
“暂停”:错误
}
});
回调();
}        
var remove_stickies=函数(回调){
Plasma.hope('edge-to-Sluck')。沉积物({描述:['Sluck','prot spec v1.0','request','remove all fluoro'],摄入:{}
});
回调();
}   
存款=功能(){
控制台日志(胶粘荧光镜);
L=JSON.parse(stickie.fluoroscopes);
控制台日志(L);

对于(var i=1;i将最后一行更改为

adjust_geo(remove_stickies(deposit_fluoros));

按照您当前的操作方式,您正在传递deposit\u fluoros的结果,而不是传递对函数的引用。

删除了所有其他对象,只是普通回调。放回您的对象,它就会工作。无论何时返回或调用回调,请确保将其作为函数返回

var adjust_geo = function (callback) {

    callback();
    console.log('adjust_geo');
}
// wrap the result of first call into a function and return it
var remove_stickies = function (callback) {
    return function () {
        callback()
        console.log('remove_stickies');
    };
}


var deposit_fluoros = function () {
    console.log('deposit_fluoros')
};

adjust_geo(remove_stickies(deposit_fluoros));
输出:

"deposit_fluoros"
"remove_stickies"
"adjust_geo"

最后一行出现问题(您必须传递回调函数,而不是进行函数调用),并且您必须将回调传递到所有函数中,或者在传递回调时签入代码:

adjust_geo(
  function(){
    remove_stickies(
      deposit_fluoros
    )
  });
这将调用调整\u geo,回调将调用移除\u胶粘物,回调将调用存款\u透视图

如果
Plasma.hope(“…”).Deposit
看起来像
Plasma.hope(“…”).Deposit(data,doneCallback)
您可以通过将下一个函数调用移动到
doneCallback
中来更新代码以按顺序运行函数:

adjust_geo = function(callback) {
    Plasma.Hose('edge-to-sluice').Deposit({
            "descrips": [
                "sluice",
                "prot-spec v1.0",
                "request",
                "zoom"
            ],
            "ingests": {
                "lat": stickie.latitude,
                "lon": stickie.longitude,
                "level": stickie.zoom_level
            }
        },
        function() {
            Plasma.Hose('edge-to-sluice').Deposit({
                "descrips": [
                    "sluice",
                    "prot-spec v1.0",
                    "request",
                    "set-time"
                ],
                "ingests": {
                    "time": stickie.start,
                    "rate": 2.0,
                    "pause": false
                }
            }, callback)
        }
    );
}

var remove_stickies = function(callback) {
    Plasma.Hose('edge-to-sluice').Deposit({
        descrips: ['sluice', 'prot-spec v1.0', 'request', 'remove-all-fluoro'],
        ingests: {}
    }, callback);
}


deposit_fluoros = function() {
    console.log(stickie.fluoroscopes);
    L = JSON.parse(stickie.fluoroscopes);
    console.log(L);
    for (var i = 1; i < L.length; i++) {
        console.log(L[i]);
        Plasma.Hose('tcp://localhost/edge-to-sluice')
            .Deposit({
                "descrips": [
                    "sluice",
                    "prot-spec v1.0",
                    "request",
                    "new-fluoro-instance"
                ],
                "ingests": L[i]
            });
    };
}
}

adjust_geo(
    function() {
        remove_stickies(
            deposit_fluoros
        )
    });
adjust\u geo=函数(回调){
等离子软管(“边缘到水闸”)。沉积物({
“描述”:[
“水闸”,
“保护规范v1.0”,
“请求”,
“缩放”
],
“摄入”:{
“纬度”:粘性纬度,
“lon”:粘滞的经度,
“级别”:粘滞。缩放\u级别
}
},
函数(){
等离子软管(“边缘到水闸”)。沉积物({
“描述”:[
“水闸”,
“保护规范v1.0”,
“请求”,
“设定时间”
],
“摄入”:{
“时间”:stickie.start,
“利率”:2.0,
“暂停”:错误
}
},回调)
}
);
}
var remove_stickies=函数(回调){
等离子软管(“边缘到水闸”)。沉积物({
描述:[“水闸”、“保护规范v1.0”、“请求”、“移除所有荧光灯”],
摄取:{}
},回调);
}
存款=功能(){
控制台日志(胶粘荧光镜);
L=JSON.parse(stickie.fluoroscopes);
控制台日志(L);
对于(变量i=1;i
Promissions是一种方法。避免回调异步函数,这会很快让您感到困惑。在34上出现错误的原因是回调()在remove_stickies函数外部调用。所需的执行顺序是什么?
adjust_geo
remove_stickies
deposit_fluoros
?@Igor它应该是adjust_geo,然后remove_stickies,然后deposit_fluoros@user3727514-那么VitaliyG的回答就是你的答案嗯,这不会给出任何未定义的错误但它似乎仍然按照移除粘滞物、放置透视图、调整地理位置的顺序进行。也许我应该改用promises?更新了我的答案-如果你在有console.log语句的地方添加代码,它就会按顺序进行。promises还依赖于幕后回调,因此它不是一对另一。也没有浏览器支持promi本机ses可靠这不会将回调传递到
adjust\u geo
这对我来说很有意义,现在控制台正在以正确的顺序记录adjust\u geo、remove\u stickies、deposit\u fluoros。但是函数本身似乎仍然以错误的顺序执行。函数内部的回调是否可能是在主代码块(Plasma.Hose…)完成之前执行?实际上,这个问题中的所有函数都不是异步的。我猜
Plasma.Hose(“…”).Deposit
是异步的,在这种情况下,您必须在这个函数中传递
回调