2015-08-13 23 views
8

Tôi cần trợ giúp về mã của mình. Tôi mới ở nodejs và có rất nhiều rắc rối với nó. gì tôi đang cố gắng để làm:fs.writeFile trong lời hứa, các công cụ đồng bộ không đồng bộ

  • 1) lấy một .txt với các sản phẩm Amazon (ASIN của)
  • 2) lấy tất cả các sản phẩm với các gói amazon-product-api

  • 3) tiết kiệm mỗi sản phẩm trong tệp .json

Mã của tôi không hoạt động. Tôi nghĩ rằng tôi đã sai lầm với công cụ đồng bộ không đồng bộ này - giúp tôi!

var amazon = require('amazon-product-api'); 
var fs = require('fs'); 

var client = amazon.createClient({ 
    awsId: "XXX", 
    awsSecret: "XXX", 
    awsTag: "888" 
}); 

var array = fs.readFileSync('./test.txt').toString().split('\n'); 
for (var i = 1; i < array.length; i++) { 
    var ASIN = array[i]; 

    return client.itemLookup({ 
      domain: 'webservices.amazon.de', 
      responseGroup: 'Large', 
      idType: 'ASIN', 
      itemId: ASIN 
     }) 
     .then(function(results) { 
      fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) { 
       if (err) { 
        console.log(err); 
       } else { 
        console.log("JSON saved"); 
       } 
      }) 

      return results; 

     }).catch(function(err) { 
      console.log(err); 
     }); 
}; 

Trả lời

-1

Để dễ sử dụng chuyển đổi không đồng bộ tất cả gọi lại thành lời hứa, hãy sử dụng một số thư viện như "bluebird".

 .then(function(results) { 
       fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) { 
        if (err) { 
         console.log(err); 
        } else { 
         console.log("JSON saved"); 
         return results; 
        } 
       }) 


      }).catch(function(err) { 
       console.log(err); 
      }); 

giải pháp Hãy thử với lời hứa (bluebird)

var amazon = require('amazon-product-api'); 
var fs = require('fs'); 
var Promise = require('bluebird'); 

var client = amazon.createClient({ 
    awsId: "XXX", 
    awsSecret: "XXX", 
    awsTag: "888" 
}); 


var array = fs.readFileSync('./test.txt').toString().split('\n'); 
Promise.map(array, function (ASIN) { 
    client.itemLookup({ 
     domain: 'webservices.amazon.de', 
     responseGroup: 'Large', 
     idType: 'ASIN', 
     itemId: ASIN 
    }).then(function(results) { 
     fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) { 
      if (err) { 
       console.log(err); 
      } else { 
       console.log("JSON saved"); 
       return results; 
      } 
     }) 
    }).catch(function(err) { 
     console.log(err); 
    }); 
}); 
5

Cập nhậttháng 9 năm 2017: fs-promise đã phản đối ủng hộ fs-extra.


Tôi chưa sử dụng, nhưng bạn có thể xem fs-promise. Đó là một mô-đun nút:

Proxy tất cả các phương thức async fs phơi bày chúng dưới dạng Promises/A + tương thích hứa hẹn (khi nào, Q, v.v.). Chuyển tất cả các phương thức đồng bộ hóa thông qua dưới dạng giá trị.

27

fs.writefile là một callback không đồng bộ truyền thống - bạn cần phải làm theo spec lời hứa và trả về một lời hứa mới gói nó với một quyết tâm và xử lý từ chối như vậy:

return new Promise(function(resolve, reject) { 
    fs.writeFile("<filename.type>", data, '<file-encoding>', function(err) { 
     if (err) reject(err); 
     else resolve(data); 
    }); 
}); 

Vì vậy, trong mã của bạn, bạn sẽ sử dụng nó như vậy ngay sau khi cuộc gọi của bạn để .then()

.then(function(results) { 
    return new Promise(function(resolve, reject) { 
      fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) { 
       if (err) reject(err); 
       else resolve(data); 
      }); 
    }); 
    }).then(function(results) { 
     console.log("results here: " + results) 
    }).catch(function(err) { 
     console.log("error here: " + err); 
    }); 
2

nói

const util = require('util') 
const fs_writeFile = util.promisify(fs.writeFile) 

https://nodejs.org/api/util.html#util_util_promisify_original

này là ít bị lỗi hơn so với câu trả lời trên bình chọn

+2

'util.promisify' đã được bổ sung trong phiên bản Node.js 8. Tư tưởng thông tin này có thể hữu ích cho những người nghĩ đến việc sử dụng nó . – Tim

Các vấn đề liên quan