第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

調整不可鏈接的函數(shù)以返回值

調整不可鏈接的函數(shù)以返回值

回首憶惘然 2022-05-26 17:18:52
我正在嘗試使用pdfreader 包在一個對象中獲取 pdf 的所有頁面。該函數(shù)在處理它時最初返回每個頁面(作為它自己的對象)。我的目標是編寫一個將所有頁面作為頁面對象數(shù)組返回的包裝器。有人可以解釋為什么這不起作用嗎?我試過:添加 .then 和返回條件 - 因為我希望 parseFileItems 方法返回一個值:let pages = [];new pdfreader.PdfReader()  .parseFileItems(pp, function(err, item) {    {      if (!item) {        return pages;      } else if (item.page) {        pages.push(lines);        rows = {};      } else if (item && item.text) {        // accumulate text items into rows object, per line        (rows[item.y] = rows[item.y] || []).push(item.text);      }    }  })  .then(() => {    console.log("done" + pages.length);  });并得到了錯誤TypeError:無法讀取未定義的屬性“then”我正在修改的功能(來自包文檔):var pdfreader = require("pdfreader");var rows = {}; // indexed by y-positionfunction printRows() {  Object.keys(rows) // => array of y-positions (type: float)    .sort((y1, y2) => parseFloat(y1) - parseFloat(y2)) // sort float positions    .forEach(y => console.log((rows[y] || []).join("")));}new pdfreader.PdfReader().parseFileItems("CV_ErhanYasar.pdf", function(  err,  item) {  if (!item || item.page) {    // end of file, or page    printRows();    console.log("PAGE:", item.page);    rows = {}; // clear rows for next page  } else if (item.text) {    // accumulate text items into rows object, per line    (rows[item.y] = rows[item.y] || []).push(item.text);  }});
查看完整描述

2 回答

?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

這里似乎同時存在幾個問題/誤解。讓我們試著一次看一次。


首先,您似乎認為外部函數(shù)將返回(“傳遞”)您的回調的返回值


正如您在庫源代碼中看到的那樣,情況并非如此。


此外,它甚至沒有意義,因為回調為每個項目調用一次。那么,對于 10 個項目,它將被調用 10 次,那么如何parseFileItems知道回調的 10 個返回值中的哪一個傳遞給外部?


從回調函數(shù)返回什么并不重要,因為該parseFileItems函數(shù)只是忽略它。此外,parseFileItems函數(shù)本身也不返回任何內容。因此,結果new pdfreader.parseFileItems(...)將始終評估為undefined(并且undefined顯然沒有屬性then)。


其次,您似乎認為這.then是函數(shù)調用的某種通用鏈接方法。


事實上,.then它是一種鏈接承諾的方式,或者對承諾的履行作出反應。在這種情況下,任何地方都沒有任何承諾,特別parseFileItems是不返回承諾(它返回undefined如上所述),所以你不能調用.then它的結果。


根據文檔,您應該自己對錯誤和流結束做出反應。因此,您的代碼將像這樣工作:


let pages = [];


new pdfreader.PdfReader()

  .parseFileItems(pp, function(err, item) {

    {

      if (!item) {

        // ****** Here we are done! ******

        console.log("done" + pages.length) // The code that was in the `then` goes here instead

      } else if (item.page) {

        pages.push(lines);

        rows = {};

      } else if (item && item.text) {

        // accumulate text items into rows object, per line

        (rows[item.y] = rows[item.y] || []).push(item.text);

      }

    }

  })

但是,我同意擁有一個 promise 包裝器會更好,這樣您就不必將以下所有代碼填充到回調的if (!item)分支中。你可以這樣實現(xiàn),使用new Promise:


const promisifiedParseFileItems = (pp, itemHandler) => new Promise((resolve, reject) => {

  new pdfreader.PdfReader().parseFileItems(pp, (err, item) => {

    if (err) {

      reject(err)

    } else if (!item) {

      resolve()

    } else {

      itemHandler(item)

    }

  })

})


let pages = []


promisifiedParseFileItems(pp, item => {

  if (item.page) {

    pages.push(lines)

    rows = {}

  } else if (item && item.text) {

    // accumulate text items into rows object, per line

    (rows[item.y] = rows[item.y] || []).push(item.text)

  }

}).then(() => {

  console.log("done", pages.length)

}, e => {

  console.error("error", e)

})

注意:使用異步生成器你會得到更好的代碼,但是現(xiàn)在在這里解釋太多了,因為從回調到異步生成器的轉換沒有你想象的那么簡單。


查看完整回答
反對 回復 2022-05-26
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

如果要鏈接 a then,則需要回調函數(shù)返回 Promise :


new pdfreader.PdfReader()

    .parseFileItems(pp, function (err, item) {

        return new Promise( (resolve, reject) => {

            let pages = ...

            // do stuff

            resolve(pages);

        }

    })

    .then( pages => {

        console.log("done" + pages.length);

    });


查看完整回答
反對 回復 2022-05-26
  • 2 回答
  • 0 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號