javascript将标准函数转换为promise

时间:2018-01-26 20:50:50

标签: javascript promise

我有一个标准功能,可以成功检查是否安装了特定应用。但是该函数需要花费一些时间来执行,我需要将它绑定到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的剩余部分用于处理。

3 个答案:

答案 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() ;
    }
  }) ;