执行请求数组失败,其中"错误:多次调用done()"。映射请求数组不会触发请求

时间:2016-10-28 15:08:05

标签: javascript promise mocha supertest

我遇到了一个有趣的问题,我需要执行一堆请求,它们执行的顺序无关紧要。 我在这段代码上使用了以下库,Mocha,Supertest(用于激活RESTful请求)和Asynquence来帮助使用promise链。

所以我所做的就是创建一个函数数组,每个函数都包含一个POST请求。我的理由是映射此数组并执行' function.apply();'执行请求但由于某种原因无效,所以我转而使用Asynquence,它成功触发了请求,然而 Mocha失败并出现以下错误:" 错误:多次调用done()"。 这是我的代码:

我要做的第一件事就是使用地图来创建一个使用'数据'我将发送:

function queryGenerator(cookie, data, done, msg) {
          return function() {
            return request('www.myurl.com')
            .post('/endpoint/sample')
            .set('cookie', cookie)
            .send(data)
            .expect(200)
            .end(function(err, res) {
              if(err) { console.log('Error when posting to preferences setup on:', data); return done(err) };
              done(msg);
            })
          }
        }

然后我有一个函数来应用这些:

function executeFunction(fn) {
          return fn.apply();
        }

所以尝试这个不起作用:

collectionOfRequestsToExectute.map(executeFunction);

这些请求似乎并没有全部解雇。 但是,以下工作,在所有请求都执行的意义上,我得到以下错误:" 错误:多次调用done()"被摩卡抛出。

it("Turn all of the other emails off", function(done) {
          const collectionOfRequestsToTurnOff = [nationalJobsPayloadTurnOff, hiringAlertsPayloadTurnOff, professionalsLikeYouPayloadTurnOff, newJobsPayloadTurnOff];
          const functionsToExec = collectionOfRequestsToTurnOff.map(function(data) {
            return queryGenerator(cookie, data, done);
          });

          ASQ('apply each request in array').all.apply(null, functionsToExec)
          .val(function() {
            var messages = Array.prototype.slice.call(arguments);
            console.log('MESSAGES:', messages);
          })
          .or(function(err) {
            console.log(err);
          })
        })

请帮忙! 我想避免必须逐一解雇这些请求。 提前谢谢!

修改:正如下面的回答,Roamer-1888(非常感谢)问题是我将Mocha的操作传递给queryGenerator,而后者又调用了()多次。

我有另一个问题,我尝试使用解决方案的示例映射要执行的函数集合,以将查询生成器上的承诺重命名为“dunn”' (见下面的代码)但是当我这样做时,我得到一个" 未捕获的TypeError:dunn不是函数"

functionsToExecute.map(function(fn) {
   return fn.apply();
})

我觉得使用地图更具可读性,我不必使用ASQ('msg').all.apply(null,functionsToExec)...

1 个答案:

答案 0 :(得分:0)

问题是,你有两个done(),Mocha和ASQ。

如上所述,第二次尝试将Mocha的完成传递给queryGenerator(),这是不正确的 - Mocha的done确实会被多次调用。

在致电ASQ(...).all.apply(null, functionsToExec)时,functionsToExec中的每个功能都会自动传递给ASQ的(done, msg)(它们被“显示”)。

要修复,您似乎只需要:

  • 仅将(cookie, data)传递给queryGenerator - 这些参数被困在关闭状态。
  • 编写queryGenerator的内部函数来接受显示的args (done, msg)

要清楚说明哪个done拼写为ASQ已完成为dunn(您可以根据自己的选择命名显示的参数)。

function queryGenerator(cookie, data) { // <<<<<< (cookie, data) here
    return function(dunn, msg) { // <<<<<< (dunn, msg) here
        return request('www.myurl.com')
        .post('/endpoint/sample')
        .set('cookie', cookie)
        .send(data)
        .expect(200)
        .end(function(err, res) {
            if(err) {
                console.log('Error when posting to preferences setup on:', data); 
                dunn(err.message); // return not required
            };
            dunn(msg);
        });
    }
}

it("Turn all of the other emails off", function(done) {
    const collectionOfRequestsToTurnOff = [nationalJobsPayloadTurnOff, hiringAlertsPayloadTurnOff, professionalsLikeYouPayloadTurnOff, newJobsPayloadTurnOff];
    const functionsToExec = collectionOfRequestsToTurnOff.map(function(data) {
        return queryGenerator(cookie, data);
    });
    ASQ('apply each request in array').all.apply(null, functionsToExec).val(function() {
        var messages = Array.prototype.slice.call(arguments);
        console.log('MESSAGES:', messages);
        done(messages);
    }).or(function(err) {
        console.log(err);
        done(err);
    });
});