【发布时间】:2019-07-19 05:37:05
【问题描述】:
我有一个似乎在我的主代码中异步运行的函数(内部包含承诺,因此它本身同步运行)。无论我如何格式化我的承诺,似乎在函数结束执行之前就发送了解析:
这个问题在逻辑上也是递归的,如果我尝试在 nameExists 函数周围添加另一个 Promise(在这个 Promise 内),然后将 resolve 放在“then”中,我会遇到嵌套 resolve 的相同问题...
document.getElementById("config-select").addEventListener("input", function(){
//check if the doc name exists: returns doc id
//promise that doc_obj is created before moving on
let doc_obj = {};
let promise = new Promise(function (resolve, reject) {
let doc_name = document.getElementById("config-select").value;
doc_obj = nameExists(doc_name);
resolve('done'); //this executes BEFORE nameExists is done processing...bringing back the original asynch issue i was trying to fix in the first place...
});
promise.then(function (result) {
alert("then: "+doc_obj);
if(doc_obj.bool === true){//it does exist:
alert("replacing id");
document.getElementById("config-select").setAttribute("doc-id", doc_obj.id);
}
else{//it doesn't:
alert("resetting id");
document.getElementById("config-select").setAttribute("doc-id", "");
}
}
);
});
nameExists 函数:
//check if the name in config-select is an existing doc (assumes name is a unique document field)
const nameExists = function(name){
//get all docs
localDB.allDocs({include_docs: true}).then(function (result) {
//return object set to default state if no match is found
let doc_obj = {bool: false, id: ""};
alert("Entering the match checker...");
for(let i =0; i<result.total_rows; i++) {
if(result.rows[i].doc.name == name){
alert(result.rows[i].doc.name);
alert(name);
doc_obj.bool = true;
doc_obj.id = result.rows[i].doc._id;
//found a match
break;
}
}
//return the result
alert("returned obj.id: "+doc_obj.bool);
return doc_obj;
}).catch(function (err) {console.log(err);});
};
理想情况下,我希望在评估我的“if 语句”之前,用 nameExists 函数的数据填充 doc_obj 或一些返回值对象。如何格式化我的 promise/resolve 语句来实现这一点?
【问题讨论】:
-
您问题中的承诺没有任何我能辨别的目的。为什么要在 promise 中包含这几行?
-
@Aalok - 你能澄清一下你期望的结果是什么吗?通过阅读您的代码,您似乎正在创建一个承诺,然后立即使用
nameExists的返回值解决它(您的问题中没有包含该值)。但也许您期待不同的结果? -
@AalokBorkar 是的,考虑 Promise 是对的,但是您需要使用 Promise inside
nameExists以便它可以为其异步结果返回 Promise。如果您尝试从nameExists同步返回值,您将始终得到undefined。同样,请发布您的nameExists函数的代码,否则我们无法帮助您解决您的问题。另外请务必阅读有关该主题的our canonicalquestions。 -
你的第一句话没有多大意义:“我有一个函数(内部包含承诺,所以它本身同步运行)”。在内部包含 Promise 表明它实际上是异步的,而不是同步的。
-
nameExists需要返回它的承诺。return localDB.allDocs(...那你可以nameExists(...).then(...)
标签: javascript asynchronous promise