我从对主题的了解极少的角度提出这个问题,并且我试图弄清并理解正在发生的事情。
我通读了How do I return the response from an asynchronous call?上的文章,但我听不懂。
但是,根据我的阅读,看来标题为“ 如果您在代码中未使用jQuery,此答案适合您”的部分就是处理该结构的部分我在用。但是,由于示例中引用的资料与我的资料有很大不同,因此我根本无法充分理解或理解它,从而无法将其有效地应用于我的代码。
我还阅读了很多其他有关从诺言链返回值的文章,但是由于我在异步JavaScript和诺言方面处于初学者水平,因此我无法完全理解或理解它们。
我希望有人能够以最简单的方式进行解释,并帮助我理解如何应用标题为“ 如果您的代码中未使用jQuery的内容”中的内容,”从How do I return the response from an asynchronous call?到我的代码。
我有一个函数,并且函数内部有一个异步javascript。
我将代码更新为此:
function LF(action, key, value){
var ectcb = localforage.createInstance({name: "ectcb"});
return ectcb.defineDriver(window.cordovaSQLiteDriver).then(function() {
return ectcb.setDriver([
window.cordovaSQLiteDriver._driver,
ectcb.INDEXEDDB,
ectcb.WEBSQL,
ectcb.LOCALSTORAGE
]);
}).then(function() {
if (ectcb.driver().toString() = 'cordovaSQLiteDriver'){
if (action = 'save'){ectcb.setItem(key, value); return true;}
else if (action = 'load'){ectcb.getItem(key, value); return true;}
else {return false;}
}
else {return false;}
}).catch(function(err) {
return false;
});
};
原来是下面的代码
function LF(action, key, value) {
var ectcb = localforage.createInstance({
name: "ectcb"
});
var thePromiseResult = ectcb.defineDriver(window.cordovaSQLiteDriver).then(function() {
return ectcb.setDriver([
window.cordovaSQLiteDriver._driver,
ectcb.INDEXEDDB,
ectcb.WEBSQL,
ectcb.LOCALSTORAGE
]);
}).then(function() {
if (ectcb.driver().toString() = 'cordovaSQLiteDriver') {
if (action = 'save') {
return ectcb.setItem(key, value);
} else if (action = 'load') {
return ectcb.getItem(key, value);
} else {
thePromiseResult = 1;
}
} else {
thePromiseResult = 1;
}
}).catch(function(err) {});
if (thePromiseResult = 1) {
return false;
} else {
return true;
}
};
我有一个名为PromiseResult的变量设置为异步代码。
我试图理解如何根据代码中显示的if / else逻辑将特定值设置为PromiseResult。
最终,将调用 LF('save','thekey','value'),我需要返回“ something”值为true或false的内容。
我希望有人能解释我如何更改此代码以实现我需要做的事情,并以非常简单的伪造方式进行解释,以便我能真正理解正在发生的事情。
我认为在.then内设置“ thePromiseResult = 1”可能不是全局设置,而只是在.then内设置所需的值。
我试图查看有关该主题的其他文章,但我无法使用它们显示的各种示例来掌握这些概念。
我的目标是在另一页上显示代码
var result = LF('fake','myKey','myValue')
if (result = false){alert("Operation Failed");
else if (result = true){alert("Operation Successful");
我正在尝试分解代码,以使其反映 2下的工作。重组代码,其中讨论了让您的函数接受回调。但是,由于该示例中使用的代码与我所使用的代码有很大不同,所以我只是不够了解,无法理解所描述的内容。
我希望有人可以采用幼儿园编码器的方法来帮助我翻译概念,以便更清楚地将其应用于我的代码。
答案 0 :(得分:0)
如果我理解您的问题,似乎您正在尝试使诺言返回不承诺的结果。假设:
// you want "result" to be 2 here
var result = somePromise
.then(asyncTwo => asyncTwo) // lets say the promise resolved with 2
result // still a promise, but you want it to be 2
这是对如何使用承诺以及为什么使用承诺的误解。处理异步代码时,回调总是会在执行同步代码后解析 。这意味着result
永远无法设置为您想要的2
。
这可能有助于将重点引向主页:
console.log('synchronous code start')
var result
var somePromise = new Promise((resolve) => {
setTimeout(() => {
resolve(2)
}, 0)
})
somePromise.then(asyncTwo => {
console.log('somePromise resolves with 2')
result = asyncTwo // set result to two
})
console.log('this code is synchronous so result still equals ', result)
setTimeout(() => {
console.log('sometime later result may equal ', result)
console.log('but your synchronous code has already finished so this is unhelpful!')
}, 500)
console.log('synchronous code finished')
答案是采用Promise
模式,以便您可以以逻辑方式处理异步代码。与其尝试将异步结果提升为同步代码(这是不可能的),不如将其他then
/ catch
链接起来,以将其他逻辑应用于异步结果。
// lets mock out an example of what you might get:
function asyncOneOrTwo () {
// one or two randomly
let oneOrTwo = Math.floor(Math.random() * 2) + 1
return Promise.resolve(oneOrTwo)
}
function LF () {
return asyncOneOrTwo()
.then(oneOrTwo => {
// you can reject with an error message instead if that's your preference
if (oneOrTwo === 1) return Promise.reject(oneOrTwo)
else return Promise.resolve(oneOrTwo)
})
}
// in another file
// chain `then` or `catch` to do additional error handling
LF()
.then(res => {
console.log('success we got: ', res)
})
.catch(err => {
console.log('fail we got: ', err)
})