我有一个标准功能,可以成功检查是否安装了特定应用。但是该函数需要花费一些时间来执行,我需要将它绑定到promise.then(function (response) { ...}
,因为应用程序检查程序执行时间太长...导致应用程序检查功能的预期响应出现异步问题。但我无法让它发挥作用。
checkSocialApp只返回true或false:
function checkSocialApp(objApp) {
if (device.platform == "iOS") {
var scheme = objApp.ios;
} else {
var scheme = objApp.and;
}
if (objApp.appName == "Facebook") {
return true ; // FB doesn't need app, can be logged in via browser
} else {
return appAvailability.check(
scheme,
function() { // success callback
console.log(scheme + " is Installed") ;
return true ;
}, function () { // Error callback
console.log(scheme + " is NOT Installed") ;
alert("You do not have the " +objApp.appName+ " app installed.") ;
return false ;
}
);
}
checkSocialApp(appObj).then(function(response){ // errors on 'then'
if (response == true) { // app IS installed
console.log("CheckApp True") ;
appObj.loginApp() ;
} else if (response == false) { // app IS NOT installed
console.log("CheckApp False") ;
appObj.disableApp() ;
}
}) ;
以上.then
出错。所以我尝试将它绑定到promise.resolve:
var promise1 = Promise.resolve(checkSocialApp(appObj)) ;
promise1.then(function(response) {
if (response == true) ...
这会成功执行checkSocialApp
函数(因为我看到从该函数中打印正确的控制台消息),但我没有将response
带回.then
的剩余部分用于处理。
答案 0 :(得分:0)
checkSocialApp
通常会收回回复吗?你可以把它包装成这样的承诺:
function checkSocialAppPromise ( appObj ) {
return new Promise( function ( resolve ) {
checkSocialApp( appObj, resolve )
});
}
答案 1 :(得分:0)
严格来说,你应该有所作为。如果checkSocialApp(appObject)
返回true或false,那么你应该得到它。你展示的是什么。如果不是,那么肯定会发生奇怪的事情。
const someFunc = () => 5;
Promise.resolve(someFunc()).then(result => console.log(result));
然而,它可能不会做你想做的事情。你不能神奇地使长时间运行的同步函数运行async。
例如,如果我有这个功能:
function runSlow() {
const start = Date.now();
while (Date.now() - start < 5000) { } // force a loop to wait 5 seconds
return true;
}
runSlow();
console.log('done');
完成需要5秒钟。我不能把它包起来,让它突然变得异步:
function runSlow() {
const start = Date.now();
while (Date.now() - start < 5000) { } // force a loop to wait 5 seconds
return true;
}
Promise.resolve(runSlow())
.then(response => console.log(response));
虽然技术上它包含在一个承诺中,它仍然需要5秒钟才能运行,它仍会阻止事物(尝试在运行时点击它,你会看到你的浏览器没有响应)。
如果您希望它正常运行,您必须修改函数本身以停止同步。没有任何方法可以将它包装在它自己的线程或任何东西中。
答案 2 :(得分:0)
你必须做这样的事情,在你的函数中返回一个承诺:
function checkSocialApp(objApp) {
return new Promise( function(resolve)={
if (device.platform == "iOS") {
var scheme = objApp.ios;
} else {
var scheme = objApp.and;
}
if (objApp.appName == "Facebook") {
resolve (true) ; // FB doesn't need app, can be logged in via browser
} else {
return appAvailability.check(
scheme,
function() { // success callback
console.log(scheme + " is Installed") ;
resolve (true) ;
}, function () { // Error callback
console.log(scheme + " is NOT Installed") ;
alert("You do not have the " +objApp.appName+ " app installed.") ;
resolve (false) ;
}
);
}
})
}
checkSocialApp(appObj).then(function(response){ // errors on 'then'
if (response == true) { // app IS installed
console.log("CheckApp True") ;
appObj.loginApp() ;
} else if (response == false) { // app IS NOT installed
console.log("CheckApp False") ;
appObj.disableApp() ;
}
}) ;