【问题标题】:Prevent function to return before async call is finished using the extend keyword使用 extend 关键字防止函数在异步调用完成之前返回
【发布时间】:2016-07-25 07:19:15
【问题描述】:

代码是这样的。

//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 函数在提供图像之前返回? 我不喜欢使用 typescript 或 babel 来解决问题。但如有需要请指教。 (也试过 babel,打字稿没有任何运气) 我尝试通过设置来使用 await 和 yield:

"android": {"v8Flags": "--expose_gc --use_strict --harmony"} 

在 package.json 文件中没有成功。

使用产量给出错误的示例

"use strict" 

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

function* test(){
  return 1;
}

在我添加 yield 关键字之前它可以正常工作。使用 yield 给出以下结果。 SyntaxError: Unexpected strict mode reserved word File : "unknown"

【问题讨论】:

  • 当您尝试使用yieldawait 时,您的代码看起来如何?
  • @AlexanderO'Mara :我正在扩展(在 java 中覆盖)一个函数。所以我不能完全控制这个功能。然后我会使用承诺或回调。我看到还建议yield,await和fibers(找不到进程对象)。我已经尝试过它们,但无法让它们在 Nativescript 中按预期工作。 (都给我错误)。所以我认为这个问题与如何在 Nativescript 中完成有关。因为等待等应该是可能的,所以我知道 es 6。据我所知,Nativescript 使用 es 5。但希望 --harmony 标记应该是可能的。
  • @t.niese 我已经使用产量更新了一个样本。您是否看到代码中的任何问题。看起来我无法使用生成器。

标签: javascript nativescript


【解决方案1】:

您想要做的可能不是一个好主意,因为它会在程序加载某些内容时阻塞 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
    }
});

【讨论】:

  • 我想使用像 yield og await 这样的东西来不阻塞 UI。但我无法让它在 Nativescript 中工作。我正在使用扩展关键字(Java 中的覆盖)并且无法在函数上使用承诺或回调。如果他们是在 Nativescript 中执行此操作的一种方式,请提供建议。
【解决方案2】:

您为此使用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
});

所有主流浏览器都支持原生 Promise.. 除了 IE(它由 edge 支持)。 如果你想要更广泛的浏览器支持,我建议使用bluebird

【讨论】:

  • 感谢您的回复。 getImage 是从 ImageProvider 扩展而来的。由模块来处理图像的实际加载并显示它。所以我认为在这种情况下我不能使用承诺。 (考虑过)。如果我错了,请纠正我。
  • @Stavanger75 这可以很好地处理图像加载。我相信显示它必须手动完成,因为 ImageProvider 没有选择器或任何方式知道在哪里显示图像。
  • Kaspars:在 Java 中扩展意味着覆盖。因此,当 getImage 返回图像时。 imageprovider 将处理它的显示方式。 docs.nativescript.org/runtimes/android/generator/….
  • @Stavanger75 ImageProvider 是自定义类吗?你能提供它的源代码吗?让它同时处理检索和显示似乎是一个奇怪的设计选择。
  • 提供的代码仅用于说明(尽可能保持简单)。您可以查看 TileProvider.getTile()。我在 Nativescript 中扩展了它,它正在工作,但在提供图块(图像)之前返回。 developers.google.com/android/reference/com/google/android/gms/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多