如何正确使用具有异步调用的Javascript函数?

时间:2017-10-15 00:05:45

标签: javascript jquery

我创建了一个返回布尔值的Javascript函数。函数中的一行代码调用REST调用。当我编码时,我没有意识到调用将是异步的。所以,基本上,该方法总是返回“假”'当我做类似的事情时:

if(isDataValid()) ...

我可以将调用函数中的操作移动到success函数,但我试图创建一个可重用的方法。我使用jQuery和Everest。我还没有学到任何关于Promises的知识,而且我对回调编程也很陌生。

这是我的方法的简化版本:

function isDataValid(){

    // Read data from Local Storage

    // Create object from data

    // Flag variable to capture result
    var isValid = null;

    restClient
        .read('/my/url', model)
        .done(function(response)
            {    
                // 'Good' response, set flag to true
                isValid = true;
            })
        .fail(function(response)
            {   
                // 'Bad' response, set flag to false
                isValid = false;
            });

    return isValid;
}

我应该如何进行异步调用并返回true / false?

1 个答案:

答案 0 :(得分:0)

功能应标记为async,以便在内部使用await

由于您没有使用响应,我删除了它。 如果您需要回复,那么

var response = await restClient.read('/my/url/', model);

您应该使用try / catch来处理错误。 结果如下:

async function isDataValid(){

   var isValid = null;

   try {
       await restClient.read('/my/url', model);
       isValid = true;
   } catch(err) {
       isValid = false;
   }

   return isValid;
}

最后要调用isDataValid,您还应该在函数调用前使用await。所以它看起来像那样:

if(await isDataValid()) { ... }

由于await只能在async个函数中使用,因此调用isDataValid的函数也应标记为async。这样,您应该更新要与await一起使用的所有函数调用链。