2015-08-15 3 views
0

Я использую функцию обещания в своем приложении. Прикрепленный ниже мой код:then() не срабатывает по функции обещания

module.exports = function (path) 
{ 
    return new Promise(function(resolve, reject) 
    { 
     fs.readFileAsync(path, encoding='UTF-8') 
     .then(function(data) { 
      return wmReuters.parseXMLtoJSON(data); 
      }).then(function(jsonedData) { 

      return new Promise(function(resolve, reject) { 
       resolve({ 
        'name': jsonedData.newsMessage.itemSet[0].packageItem[0].contentMeta[0].slugline[0]['_'], 
        'description': jsonedData.newsMessage.itemSet[0].packageItem[0].contentMeta[0].headline[0]['_'], 
        'date': jsonedData.newsMessage.itemSet[0].packageItem[0].itemMeta[0].firstCreated[0], 
        'ingestDate': new Date(), 
        'lastModified': jsonedData.newsMessage.itemSet[0].packageItem[0].itemMeta[0].versionCreated[0], 
        'sourceId': jsonedData.newsMessage.itemSet[0].packageItem[0].contentMeta[0].altId[0]['_'], 
        'sourceNmae': 'Reuters', 
       }); 

      }); 

     }).catch(function(err) { 
      reject(new Error('Parsing Error: ' + err)); 
    }); 
}); 

} 

и я назвал эту функцию в другом файле (эта функция импортируется как синтаксический анализатор)

parser('./Ingestor/XMLs/2014script/2014-01-01T000815Z_3_WNE9CUATJ_RTRWNEC_0_2210-UAE-DUBAI-NEW-YEAR-FIREWORKS.XML').then(function(obj) { 
console.log(obj); 
}).then(function(clip) { 
console.log(clip); 
}).catch(function(err) {console.log(err);}) 

Первый тогда() прилагается после синтаксического анализа никогда не срабатывает. Интересно, что не так с моим кодом (Возможно, что-то не так с решением, я думаю, но я не уверен, где)

ответ

2

Вы никогда не решаете самое верное обещание, которое возвращается, поэтому обработчик вызывающего абонента .then() никогда не вызывается. Вместо того чтобы создавать новые обещания, вы можете просто использовать те, которые уже есть, возвращая fs.readFileAsync() обещания иметь так:

module.exports = function (path) { 
    return fs.readFileAsync(path, encoding='UTF-8') 
    .then(function(data) { 
     return wmReuters.parseXMLtoJSON(data); 
     }).then(function(jsonedData) { 
      return { 
       'name': jsonedData.newsMessage.itemSet[0].packageItem[0].contentMeta[0].slugline[0]['_'], 
       'description': jsonedData.newsMessage.itemSet[0].packageItem[0].contentMeta[0].headline[0]['_'], 
       'date': jsonedData.newsMessage.itemSet[0].packageItem[0].itemMeta[0].firstCreated[0], 
       'ingestDate': new Date(), 
       'lastModified': jsonedData.newsMessage.itemSet[0].packageItem[0].itemMeta[0].versionCreated[0], 
       'sourceId': jsonedData.newsMessage.itemSet[0].packageItem[0].contentMeta[0].altId[0]['_'], 
       'sourceNmae': 'Reuters', 
      }; 
     }); 
    }).catch(function(err) { 
     throw (new Error('Parsing Error: ' + err)); 
    }); 
} 

FYI, вы можете иметь опечатки в sourceNmae: 'Reuters'.

+0

Я решил это, добавив. Then (разрешить, отклонить) после catch (function (err)). Тем не менее, приятно поймать! – TheCoolestPenguin

+0

@ TheCoolestPenguin - '.then (разрешить, отклонить)' является анти-шаблоном (отходы кода и не нужны). Это никогда не понадобится. Если вы изучите и скопируете мой ответ, вы увидите, что вам вообще не нужно создавать свои собственные обещания. Вы можете просто вернуть тот, который 'fs.readFileAsync()' уже создан, и просто привязать другие операции к этому обещанию. – jfriend00

+0

Спасибо! Не было обещаний. Теперь я понимаю это намного лучше. – TheCoolestPenguin

Смежные вопросы