在使用extend关键字完成异步调用之前,阻止函数返回

时间:2016-07-25 07:19:15

标签: javascript nativescript

代码是这样的。

//Extending a Nativescript module.      
var test = ImageProvider.extend({

  getImage: function(url){

    //async call to get the image from cache
    cacheService.getImage(url,  
      function(image){
         return image
      }, 
      function(error){ 
        return null 
    });
 }
});

如何在提供图像之前阻止getImage函数返回? 我不想使用打字稿或babel来解决问题。但如果需要请提供建议。 (还试过babel,打字稿没有任何运气) 我试图通过设置:

来使用await和yield
"android": {"v8Flags": "--expose_gc --use_strict --harmony"} 
在package.json文件中

没有成功。

使用yield

给出错误的示例
"use strict" 

function onNavigationgTo(args){ 
  yield test(); 
}

function* test(){
  return 1;
}

在添加yield关键字之前,它没有错误。使用产量给出以下内容。 SyntaxError:意外的严格模式保留字文件:"未知"

2 个答案:

答案 0 :(得分:0)

您可以使用ES6 Promises

var test = ImageProvider.extend({
  getImage: function(url){
    //async call to get the image from cache
    return new Promise(function(resolve,  reject) {
        cacheService.getImage(url,  
          function(image){
             resolve(image);
          }, 
          function(error){ 
            reject(error);
        });
    });
 }
});

然后像这样使用它

test.getImage('http://...').then(function(image) {
    // do stuff
});

所有主流浏览器都支持原生承诺..除了IE(边缘支持)。 如果您希望获得更广泛的浏览器支持,建议您使用bluebird

答案 1 :(得分:0)

你想做的事情可能不是一个好主意,因为它会在程序加载时阻止UI。通常通过回调或承诺/自定义任务实现来解决此问题。回调示例:

getImage: function(url, callback){
    //async call to get the image from cache
    cacheService.getImage(url,  
      function(image){
         callback({ image: image, error: null });
      }, 
      function(error){ 
        callback({ image: null, error: error });
    });
 }

然后用法看起来像

ImageProvider.getImage('someurl.png', function(result) {
    if (result.image) {
        // image has successfully downloaded -- good!
    }
    else {
        // handle result.error
    }
});