2016-12-28 3 views
0

Ниже приведено обещание, которое имеет два простых шага, которые отображаются на консоли, а затем отображает что-то еще после завершения первого шага.Решение обещания javascript

Я пытаюсь понять, как решить обещание, и разрешить второй шаг.

var lookup_documents = new Promise(
    function(resolve, reject) { 
     console.log("1st"); 
     //resolve(); - How do I do this outside of this function? 
    } 

); 

lookup_documents.then(
    function() { 
     console.log("2nd"); 
    } 
); 
+0

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise –

+0

Что вы имеете в виду под «внешней функции»? Тебе не следует. Просто сделайте первый шаг внутри этой функции. – Bergi

ответ

0

Обычно вы используете new Promise(), когда вы хотите, чтобы обернуть некоторые асинхронные функции в обещание, такие как:

new Promise((resolve, reject) => { 
    makeAjaxCall((err, data) => { 
     if(err) return reject(err); 
     else return resolve(data); 
    }) 
}); 

Есть и другие варианты реализации Promise, такие как q, где вы можете создать «отложенный «объект, который возвращает обещание ... Что-то подобное было бы:

function makeAjaxCallPromise() { 
    let deferred = Q.defer(); 
    makeAjaxCall((err, data) => { 
     if(err) return deferred.reject(err); 
     else return deferred.resolve(data); 
    }); 
    return deferred.promise; 
} 

Для конкретной вещи, которую вы хотите ... Все, о чем я могу думать, объявлено переменные за пределы области видимости функции посыла и Asign его, что-то вроде:

let resolver, rejecter; 
new Promise((resolve, reject) => { 
    resolver = resolve; 
    rejecter = reject; 
}); 
makeAjaxCall((err, data) => { 
    if(err) return resolver(err); 
    else return rejecter(data); 
}); 

Но это не выглядит слишком хорошо, и может привести к ошибкам ... Попробуйте обернуть все в вашей функции Promise.

0

Вы можете сделать это так, используя ваш пример - если я вас правильно понимаю.

var lookup_documents = function() { 
    return new Promise(function(resolve, reject) { 
    console.log("1st"); 
    resolve(); 
    }); 
}; 

lookup_documents().then(function() { 
    console.log("2nd"); 
}); 
+0

Это прекрасно, отлично работает. Чтобы уточнить здесь, я пытался вызвать функцию в первой части обещания, которая выполняла вызов API, и хотела разрешить первую часть обещания после завершения API (в отдельной функции). –

+0

Вы смогли понять это? В противном случае я могу изменить свой ответ с решением для этого. –

+0

Я принял вышеуказанное предложение и поместил API в первую часть обещания, а затем разрешил его по завершении вызова API. Чтобы инициировать вызов API, я использую второй фрагмент кода, представленный здесь, с вставленными командами для выполнения на основе успешного решения первой части обещания. - Спасибо, это сделало мой день! –

Смежные вопросы