在异步闭包中设置变量后再确定变量是否已设置?

时间:2015-08-24 20:17:54

标签: javascript backbone.js asynchronous parse-platform

我正在尝试从Parse数据库中检索整个对象,但这不是特定于Parse的问题。我正在尝试使用对象的唯一ID来检索整个对象并将其分配给resultObject变量,以便稍后我可以在同一个addPerk函数中保存对resultObject的引用。

正在发生的事情是,下面的块的最后一行的alert()回来说是resultObject未定义。我相信这是因为objectQuery的成功函数是在alert()行之后调用的,因为它具有异步性质。但是,我认为我可以通过创建一个while()循环使程序等到resultObject定义来解决这个问题。为什么这不起作用?我怎样才能将resultObject从成功函数的范围中删除?

我不想将所有剩余的逻辑移到查询的成功块中,我已经遇到了主要的“死亡金字塔”,并且不想让代码更难以阅读。

addPerk:     function() 
{
    var resultObject;        

    var Object = Parse.Object.extend("Object");
    objectQuery = new Parse.Query(Object);
    objectQuery.get(objectId, {
        success: function(object) {
            alert("returned object in success function is " + object);
            resultObject = object;
            alert("resultObject in success function is:" + resultObject);
        },
        error: function(object, error) {
            alert("error: " + error.code + ", " + error.message);
        }
    });

    while (typeof correctProvider == "undefined") {
        setTimeout(null, 3000);
    }
    alert("resultObject (after WHILE loop) is: " + resultObject);

1 个答案:

答案 0 :(得分:0)

  

为什么这不起作用?

while (typeof correctProvider == "undefined") {
    setTimeout(null, 3000);
}

这是你的逻辑:

  1. 输入while循环
  2. 设置超时
  3. 转到1
  4. JavaScript在循环周围循环,在内存耗尽之前设置尽可能多的超时处理程序。

    它太忙了,看看是否其中任何一个实际超时,或者运行成功函数。

      

    我怎样才能将resultObject从成功函数的范围中删除?

    你没有。

    你必须从回调中前进,你不能回去。

    使回调完成您获取数据时要执行的工作。