Aysnc для каждой проблемы обратного вызова - PullRequest
0 голосов
/ 13 июня 2018

Я использую async для каждой задачи, с которой я сталкиваюсь, проблема в том, что окончательный обратный вызов никогда не выполняется

Сценарий : у меня есть список контактов и я хочу отправить сообщениевсем контактам параллельно и при отправке сообщения хотите сохранить ответ в массиве и затем выполнить какое-либо действие при окончательном обратном вызове

sms.js

function SmsService() {}

SmsService.prototype.sendSms = function(value, callback) {

       client.messages
            .create({
                body: value.body,
                from: value.from,
                to: value.to
            })
            .then(message => {
                console.log('meesage going', message.sid);

                callback(null,message.sid)
            })
            .catch(e => {

                callback(null,'not send')

            })
   }


module.exports = SmsService;

sender.js

  var SmsService = require(path.resolve(__dirname, './sms'));
     var smsService = new SmsService();
     var data = [{body:'1232324',from:'+12323123',to:'+12312323'},
     {body:'112123234',from:'+123123123',to:'+123213123'}, {body:'12sadasdasd34',from:'+112123123',to:'+1223213123'}]

     async.forEachOf(data, function (value, i, cb) {
        console.log('started',i)
            smsService.sendSms(value, function(error, result) {
                console.log('sending',i,value.to)//only get result for first item 
                results.push(result)
                cb()
            })

     }, function (err) {
        if (err) console.error(err.message);
         console.log('all done')//never executes
        console.log(results);//never executes
    });

Если я перевожу асинхронную часть в службу SMS, она работает нормально, но я хочу оставить отдельную службу SMS

1 Ответ

0 голосов
/ 01 марта 2019

Вы можете попробовать что-то вроде этого.

sms.js

function SmsService() {}

SmsService.prototype.sendSms = function(value, callback) {

    return new Promise((resolve, reject) => {
        // Do async job
        client.messages
            .create({
                body: value.body,
                from: value.from,
                to: value.to
            })
            .then(message => {
                console.log('meesage going', message.sid);
                resolve(callback(null,message.sid))
            })
            .catch(e => {
                reject(callback(null,'not send'))
            })
    })
}
module.exports = SmsService;

sender.js

var SmsService = require(path.resolve(__dirname, './sms'));
var smsService = new SmsService();
var data = [{body:'1232324',from:'+12323123',to:'+12312323'},
            {body:'112123234',from:'+123123123',to:'+123213123'}, 
            {body:'12sadasdasd34',from:'+112123123',to:'+1223213123'}];
var promises = [];
data.forEach(async function (obj, index) {
    console.log('started',index)

    promises.push(await smsService.sendSms(obj, function(error, result) {
        console.log('sending',i,value.to)//only get result for first item 
        results.push(result)
    }));
});

Promise.all(promises).then(function () {
        console.log("Messages sent")
}).catch(function (err) {
        console.log("Messages not sent")
})
...