相关疑难解决方法(0)

如何用promise实现这个方法

我如何使用promise等待异步地理编码方法返回结果然后返回true或false?

function LocationValidator(value, element, paras) {
var geocoder = new google.maps.Geocoder();

geocoder.geocode({ 'address': value }, function (results, status) { // called asynchronously
    if (status == google.maps.GeocoderStatus.OK) {
        return true;
    } else {
        return false;
    }
});
}
Run Code Online (Sandbox Code Playgroud)

javascript asp.net-mvc promise

1
推荐指数
1
解决办法
1958
查看次数

事件和回调,需要在两个事件触发之前等待并调用回调

代码可以简化为类似的东西,

function start(callback) {
    one.on('ready', () => {
        console.log('one server ready');
    });

    two.on('ready', () => {
        console.log('two connection ready');
    });

    one.connect();
    two.start();
}
Run Code Online (Sandbox Code Playgroud)

callback在两个服务进入就绪状态后,我需要调用它.什么是最好的模式?

更新:欢迎使用RxJS如何做到这一点:)

javascript node.js promise rxjs async.js

1
推荐指数
2
解决办法
1354
查看次数

Promisifying xml2js解析函数(ES6 Promises)

我正在尝试重构一些节点代码,这些代码是一堆乱七八糟的回调.我认为为了这个目的,尝试承诺会很好.我正在尝试使用xml2js节点模块将一些xml字符串转换为json .原始代码是:

"use strict";

var xml2jsParser = require('xml2js').parseString;

var string = "<container><tag3>option3</tag3></container>";

xml2jsParser(string, function(err, result)
{
    console.log(result);
});
Run Code Online (Sandbox Code Playgroud)

这显示:

{ container: { tag1: [ 'option1' ], tag2: [ 'option2' ], tag3: [ 'option3' ] } }
Run Code Online (Sandbox Code Playgroud)

关于这个问题的第一个答案如何将现有的回调API转换为承诺?我尝试使用promises以下列方式包装xml2jsParser函数:

"use strict";

var xml2jsParser = require('xml2js').parseString;

function promisesParser(string)
{
    return new Promise(function(resolve, reject)
    {
        xml2jsParser(string, resolve);
    });
}

var string = "<container><tag3>option3</tag3></container>";

promisesParser(string).then(function(err, result){
    console.log(result);
});
Run Code Online (Sandbox Code Playgroud)

这将undefined通过控制台显示,而不是按预期显示在json对象上.我不明白为什么会发生这种情况,因为我能够成功地对其他功能做同样的事情.我知道使用Bluebird promisify功能可以实现类似的功能,但我想在没有任何第三方库的情况下在普通的Javascript上执行此操作.

javascript json node.js promise es6-promise

1
推荐指数
2
解决办法
5082
查看次数

foreach循环中的promise(Typescript 2)

我坚持使用promise链,我需要在将图像上传到服务器后继续执行一些代码.它是Angular2和Typescript.让我们写一些伪代码:

uploadImages(images):Promise<any> {
    return new Promise((resolve, reject) => {
        for (let image of images) {
            upload(image.type_1).on('upload_completed', (data) => {
                 // do something
            })

            upload(image.type_2).on('upload_completed', (data) => {
                 // do something
            })
    }
}

uploadImages(images).then(doSomethingElse);
Run Code Online (Sandbox Code Playgroud)

我以某种方式完成了这项任务,但我对承诺链有点困惑,我无法弄清楚如何在foreach循环中链接这个图像上传,并在所有上传时将结果返回到新的承诺中完成.这样做的正确方法是什么?

编辑:循环中有基于事件的回调,如何使用Promise.all()转换为promises它们?

promise typescript angular

1
推荐指数
1
解决办法
8696
查看次数

如何创建从回调函数返回promise的函数

我使用有api的javascript库.

libapi.callnetwork(arg1,callback(data){
//handle data
}
Run Code Online (Sandbox Code Playgroud)

然后我创建服务函数来像这样调用api

myFunction():Promise<any>{
  libapi.callnetwork(arg1,callback(data){
    return new Promise(resolve=>resolve(data));
  })
}
Run Code Online (Sandbox Code Playgroud)

myFunction将收到错误,因为它必须返回promise或声明为void.如何创建从此API返回承诺的函数?

callback promise typescript angular

1
推荐指数
1
解决办法
1万
查看次数

如何在node.js中的get-request之后返​​回值?

当我收到服务器响应时如何获取这个值?

当我运行它时,终端没有输出任何信息。

console.log(a);
function findMaxID() {
    var a = needle.get(URL, function(err, res){
        if (err) throw err;
        return 222; 
    });
    return a;
}
Run Code Online (Sandbox Code Playgroud)

javascript node.js needle.js

1
推荐指数
1
解决办法
6805
查看次数

重构承诺从函数返回

我正在使用JSZip解压缩运行异步的目录.我想编写一个解压缩文件并返回与之关联的文件的函数,如下所示:

function unzipFile(filename){
  const zipper = new jsZip()
  return fs.readFile(filename, function(err, data) {
    return jsZip.loadAsync(data).then(function(zip) {
      return zip.files
    })
  })
}
Run Code Online (Sandbox Code Playgroud)

但这只是回归undefined.我如何使这个异步,以便它在单个函数中返回解压缩的目录,如果我想设置一个等于其输出的变量将等待它的完成?

javascript asynchronous async-await

1
推荐指数
1
解决办法
308
查看次数

如何在JavaScript中链接两到三个第三方回调?

Web应用程序页面包含两个大组件,它们在完全呈现时会调用回调.

问题是在两个组件完全呈现后调用函数.

这可以通过使用超时和轮询一些变量来解决,但我想应该有更好的方法.

让我们说,我有这样的:

function callMeAfterBothRendered() {...};
libA = libraryA($('.comp1'), {"rendered": function () {...}});
libB = libraryB($('.comp2'), {"rendered": function () {...}});
Run Code Online (Sandbox Code Playgroud)

我已经找到了链接承诺的一些材料,但不太确定如何应用于这种情况?

一个复杂的问题是,实际上这些库不是直接在同一个地方调用的(如上面简单示出的),而是在适配器"类"中更深层次的一些初始化方法中.

什么可以是这个的好解决方案,也可以很容易地推广到3个组件?

javascript

1
推荐指数
1
解决办法
47
查看次数

NodeJS 代码不等待函数完成

我正在创建一个带有 Lambda 函数的 Excel 文件,该文件稍后通过电子邮件发送。Excel之前填充数据,然后像这样存储(使用excel4node nom包):

console.log("Before print");
    var test2 = await workbook.write(path, function(err, stats) {
        console.log("Excel written");
        if (err) {
          console.error(err);
        } else {
          console.log(stats); // Prints out an instance of a node.js fs.Stats object

        }
      });
    console.log("After print");
Run Code Online (Sandbox Code Playgroud)

该代码有时有效。问题是下面的代码没有等到写好excel并且电子邮件找不到附件。

如何让我的 Lambda 函数等到 excel 写入磁盘?

asynchronous node.js

0
推荐指数
1
解决办法
715
查看次数

为什么 Promise.all() 不能与异步函数一起使用?

我正在探索 Promise.all() 的使用,但我不知道为什么它没有给我预期的结果。我尝试一步一步地说明它。

让我们看一下我的代码:

var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 2000, 'foo');
});


var apiCall = async () =>{
    // to simulate a api call that will response after 5 sec 
     setTimeout(() => {return 1000}, 5000); 
    
}

Promise.all([p2,p3,apiCall()]).then(values => {
  console.log(values); // [3, 1337, undefine], but I expect  [3, 1337, 1000]
});

apiCall().then((response)=>{console.log(response)})
Run Code Online (Sandbox Code Playgroud)

据我了解,async 函数会立即返回一个 Promise,这就是 Promise.all 会等待的。

所以我期望,

.then(values => {
  console.log(values); // [3, 1337, undefined]
});
Run Code Online (Sandbox Code Playgroud)

5秒后才会执行。

但 2 秒后的输出已经如下所示,而不是 [3, …

javascript es6-promise

0
推荐指数
1
解决办法
210
查看次数

Promise 语法/替代

我希望返回一个稍后自行解决的 Promise,但似乎我的语法无效,我很好奇什么是更好的实现。为什么 Promise 构造函数需要执行器?

promise = new Promise() 无效,因为我需要提供一个函数

function getDetails (someHash) {
    var url = "http://somewebsite.com/" + someHash,
        promise = new Promise();

     makeAjaxRequest(url, function (response) {
         promise.resolve(response.data);
     });

     setTimeout(function () {
         promise.reject("timeout");
     }, 500);

     return promise;
}

function makeAjaxRequest (url, callback) {
    var someResponse = {data: "some data"};

    setTimeout(function () {
        callback(someResponse);
    }, 200);
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现这个功能?

javascript asynchronous promise

-2
推荐指数
1
解决办法
1933
查看次数

如何使用这种模式将RSVP承诺设置为可链接的闭包装?

我想获取RSVP全局对象,并将其包装到我的全局应用程序闭包内的闭包中,以便我可以按照我想要的方式调用它.它还使我更容易记住如何使用它,以后在开发中.

以下是一些背景知识:RSVP库使用它的承诺教程.

所以给定RSVP的这个标准用法:

new RSVP.Promise(function(resolve, reject) {
  // succeed
  resolve(value);
  // or reject
  reject(error);
});
Run Code Online (Sandbox Code Playgroud)

如何使用您在下面看到的设计模式为此创建包装器?我想把这个RSVP对象放到包装器中,这样我就不必每次都在同一个地方实例化一个新的RSVP Promise并定义我的回调.

我希望var newPromise = app.core.promise(callback)每次想要做出新的承诺时都会打电话.

我怎样才能将它包装成一个闭包以便可能?这是我到目前为止 - 正确的方法是什么?

app.core.promise = function (resolveFunc, paramObj) {

    if(typeof(resolveFunc) === 'function'){

        //lets move on shall we?
        return new window.RSVP.Promise(function(resolveFunc, reject){

            //so this is the real question, what am i to do here?
            if(paramObj){
                //do something with this object first, or just run it, depending on your use case
                //paramObj = chopBalls(paramObj);
                resolveFunc(paramObj); …
Run Code Online (Sandbox Code Playgroud)

javascript promise deferred rsvp.js

-4
推荐指数
1
解决办法
405
查看次数