Обещать внутри обещание: какой правильный способ вернуть переменную от ребенка обещают? (ДС)
У меня есть такая функция:
function top() {
//promise1
ParentPromise({
...some code here...
}).then(function() {
//promise2
ChildPromise({
..some code here...
}).then(function(response) {
var result = response.result.items;
});
});
};
и мне нужно вернуть результат таким образом:
var myresult = start();
Как я могу это сделать? спасибо
Ответы
Ответ 1
Определение promises заключается в том, что вы не можете буквально назначить result
myresult
. Однако вы можете сделать myresult
обещание, которое разрешается непосредственно для result
для вызывающего, однако для этого было использовано много promises. Основная идея заключается в том, что внутри каждой функции в вашем предыдущем блоке вы должны быть return
следующего Promise в цепочке. например:
function top() {
//promise1
return ParentPromise({
...some code here...
}).then(function() {
//promise2
return ChildPromise({
..some code here...
}).then(function(response) {
var result = response.result.items;
return result;
});
});
};
В конце концов, код, вызывающий top()
, не знает или не заботится о том, чтобы 1, 2 или 12 прикованных promises были использованы для получения result
. Он также сможет зарегистрировать обратный вызов ошибки в случае отказа любого из этих promises.
Ответ 2
Не совсем уверен, что это будет работать с родным JS promises, но в PromiseKit
(swift.. я знаю, но я уверен, что это должно работать). Я привык возвращать второе обещание и цепью это так:
function top() {
//promise1
return ParentPromise({
...some code here...
}).then(function() {
//promise2
return ChildPromise({
..some code here...
})
}).then(function(response) {
var result = response.result.items;
});
}
top().then(function(){
// all done
});
Ответ 3
Проблема заключается в том, что вы пытаетесь использовать асинхронный код синхронно. Вам нужно будет изменить то, как вы думаете при работе с асинхронным кодом.
Один из способов решения этого вопроса - вернуть() return ParentPromise, а затем установить переменную myresult с помощью .then() возврата этого обещания.
function top() {
...
return ParentPromie;
}
var myresult = ''; // default value until you have resolved your promise
top().then(result => myresult = result);
Однако для этого вам нужно будет добавить код, чтобы решить ваше обещание:
var ParentPromise = new Promise(function(resolve) {
... some code...
var ChildPromise = new Promise(function(){
...some code...
}).then(function(response){
resolve(response.result.items);
});
});