功能完成后消防

时间:2017-04-14 09:10:38

标签: javascript jquery

嘿伙计们就是这种情况

function makeIt()
{
  //code
  createSomething()
}

function createSomething(){
 //code
  request.execute(function(resp) {
  function writeSomething(){
    //code
  }
   createSomething()
   goback()
 }
}

我想在writesomething完成后执行goback。 问题是writesomething功能可以在2秒或10秒内完成(取决于文件)。我现在使用setTimeout只是为了确定。 但是,当写完这些东西时,我怎么能让goback exucute?

编辑:

function writeToSheet(){
//this is a part of the function (deleted some information)
                params 

            var xhr = new XMLHttpRequest();

            xhr.open('PUT', 'https://something.com');
            xhr.setRequestHeader(some things);
            xhr.send(JSON.stringify(params));
        }   

2 个答案:

答案 0 :(得分:3)

请参阅底部的更新,现在您已包含writeToSheet定义。

如果writeSomething异步进程,它将为您提供一种方法,让您知道它何时完成 - 它将接受回调,返回承诺等。传递{{ 1}}作为回调(或作为承诺上的goback回调等)。

示例 - 如果 then接受回调:

writeSomething

writeSomething(other, arguments, here, goback);
// This is the callback ---------------^^^^^^

...取决于您是否希望writeSomething(other, arguments, here, function() { goback(); }); 接收goback通过其回调的任何参数。

示例 - 如果 writeSomething返回承诺:

writeSomething

writeSomething(other, arguments, here).then(goback);

...再次取决于您是否希望writeSomething(other, arguments, here).then(function() { goback(); }); 接收传递给goback回调的值。

如果then同步进程可能需要2-10秒,请在致电writeSomething后致电goback()。即使writeSomething需要10秒钟,如果它真正同步,writeSomething也不会被调用,直到它完成。

示例(仅为完整性:-)):

goback

更新:您的writeSomething(other, arguments, here); goback(); 函数启动异步进程,因此我们要将其编辑为接受回调或返回承诺。

接受回电:

writeToSheet
如果成功,

function writeToSheet(callback){ // ^------------------------------------ *** var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { // *** if (xhr.readyState === 4) { // *** callback(xhr.status === 200); // *** } // *** }; xhr.open('PUT', 'https://something.com'); xhr.setRequestHeader(some things); xhr.send(JSON.stringify(params)); } 将使用writeToSheet调用回调,否则调用true

然后:

false

writeToSheet(goback);

...如果您不希望writeToSheet(function(flag) { // Maybe use the flag here, or not, depends on what you want goback(); }); 收到该标志。

回复承诺:

goback

然后:

function writeToSheet(){
    return new Promise(function(resolve, reject) {           // ***
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {                // ***
            if (xhr.readyState === 4) {                      // ***
                if (xhr.status === 200) {                    // ***
                    resolve();                               // ***
                } else {                                     // ***
                    reject();                                // ***
                }                                            // ***
            }                                                // ***
        };
        xhr.open('PUT', 'https://something.com');
        xhr.setRequestHeader(some things);
        xhr.send(JSON.stringify(params));
    });
} 

...仅在成功时调用writeToSheet().then(goback).catch(function() { // It failed }); 并在失败时调用其他函数,或

goback

...无论如何都会调用writeToSheet().then(goback, goback);

答案 1 :(得分:0)

将您的回调函数作为参数传递

function writeSomething(callback) {
    ...
    callback();
}

function myCallbackFunction() {
    alert('hi!');
}

writeSomething(myCallbackFunction);