2016-12-28 49 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); 
    }) 
}); 

還有其他的承諾的實現,如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); 
}); 

但是,這並不顯得過於好,可能會導致錯誤...嘗試來包裝你的諾言功能應有盡有。

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調用,我使用這裏提供的第二段代碼和插入的命令,根據承諾第一部分的成功解決方案執行。 - 謝謝,這是我的一天! –