2016-12-28 100 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调用,我使用这里提供的第二段代码和插入的命令,根据承诺第一部分的成功解决方案执行。 - 谢谢,这是我的一天! –