2015-06-02 262 views
0

我一直在使用承诺,但偶尔偶尔发现我似乎无法解决的问题(没有双关语意思)。为什么在通过承诺解决之前,我的承诺散列解决?

我有一个文件数组,我必须为每个文件执行异步函数调用以获取一些元数据。

我使用RSVP.hash()并传递了一个函数返回的承诺数组,它加载了一些元数据并将其作为属性添加到文件中。我的问题是hash()函数返回的许诺会在任何传递的promise被解析之前得到解决,因此它很快就会进入then()函数。

我创建了JSfiddle,说明了我的问题。我已经探索过这种可能性,这不是由于RSVP引起的,而是JavaScript解释器如何读取代码,并且可能立即评估我认为最后会运行的部分。

我使用RSVP.hash()错误的方式,错过了什么,或在我的代码中有任何其他错误,会导致它的行为,而不是我的意图是什么?

下面的代码片段与JSFiddle相同。

function checkFileStatus(item) { 
 
    return new RSVP.Promise(function(resolve, reject) { 
 
    setTimeout(function() { 
 
     $('#list').append("<li>Checking status for " + item.title); 
 
     resolve(); 
 
    }, 1000); 
 
    }); 
 
} 
 

 
function init() { 
 
    var fileList = [{ 
 
    title: "First object" 
 
    }, { 
 
    title: "Second object" 
 
    }, { 
 
    title: "Third object" 
 
    }]; 
 

 
    var statusCheck = fileList.map(function(item) { 
 
    return checkFileStatus(item); 
 
    }); 
 

 
    var promises = { 
 
    promisesCheckFileStatus: statusCheck 
 
    }; 
 

 
    RSVP.hash(promises).then(function() { 
 
    $('#list').append("<li>This should happen last!"); 
 
    }); 
 
} 
 

 

 

 
init();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<script src="//cdn.jsdelivr.net/rsvp/3.0.6/rsvp.js"></script> 
 
<div> 
 
    <ul id="list"></ul> 
 
</div>

回答

1

对象你想用hash()解决有阵列充满了承诺。 hash仅解析承诺本身的键/值。

那么,你有这样的

var promises = { 
    key: [promise1, promise2, promise3] 
}; 

你应该有

var promises = { key: PromiseThatWillResolveToOtherPromises }; 

变化

var promises = { 
    promisesCheckFileStatus: statusCheck 
}; 

var promises = { 
    promisesCheckFileStatus: RSVP.all(statusCheck) 
}; 
+0

哇,多么简单的事情可以忽略。下一次,我会确保我记住我实际通过的参数!谢谢! –

1

散列部分不正确。密钥promisesCheckFileStatus包含一个数组而不是一个承诺。你需要做这样的事情:

var promises = { 
    promisesCheckFileStatus: checkFileStatus(fileList[0]), 
    promisesCheckFileStatus1: checkFileStatus(fileList[1]), 
    promisesCheckFileStatus2: checkFileStatus(fileList[2]), 
};