Как передать данные обещания по.затем цепочка в node.js ?

#javascript #node.js #promise

#javascript #node.js #обещание

Вопрос:

Я попытался передать данные ReadFile через цепочку обещаний.

Он способен читать, но когда я передаю данные чтения в WriteFile, они получают undefined и записываются в файл:

Вот результат:

 node promise.js 
In fileFunction:
promiseResolveCallback():  File found!
readFromFileCallback: 11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111


writeToFileCallback: undefined
  

Мой код:

 var objFs   = require( 'fs' )

function promiseResolveCallback( arg )
{
    console.log("promiseResolveCallback(): ", arg)
}

function promiseRejectionCallback( arg )
{
    
    console.log("promiseRejectionCallback(): ", arg)
    throw -999;
}

function writeToFileCallback( argPromise )
{
    objFs.writeFile( 'new.js',
                     argPromise.data, 
                     ( argError ) => 
                     { 
                        if( argError ) 
                            throw argError 
                        else 
                            console.log( "writeToFileCallback: Written in new.js!" ) 
                     } 
                   )
}

function readFromFileCallback()
{
    return new Promise( (resolve, reject ) =>
                        {
                            objFs.readFile( 'new.js', ( argError, argData ) =>
                                                        {
                                                            if( argError )
                                                            {
                                                                reject( argError )
                                                                console.log( "readFromFileCallback: "   argError )
                                                            }
                                                            else
                                                            {
                                                                resolve( "read file n")
                                                                console.log( "readFromFileCallback: "   argData )
                                                            }
                                                        }
                                          )
                        }
                     )  
}

function fileFunction()
{                        
     console.log("In fileFunction:")
     return new Promise( ( resolve, reject ) =>
                       {
                            objFs.open( 'new.js', 
                                        'r', 
                                        ( argError, argFD ) =>
                                        {
                                            if( argError )
                                            {
                                                reject( new Error("File not found!"), 1000);
                                            }
                                            else
                                            {
                                                resolve("File found!", 1000);
                                            }
                                        }
                                      )
                       }
                     );
} 

var objPromise = fileFunction()
objPromise.then( promiseResolveCallback, promiseRejectionCallback )
       .then( readFromFileCallback )
       .then( writeToFileCallback )

objPromise.catch( ( argError ) =>
                {
                    console.error( argError )
                } 
             )


                   
                    
                  
  

Комментарии:

1. у fs уже есть API с обещанием. Подробнее nodejs.org/api/fs.html#fs_fs_promises_api .

Ответ №1:

Я совсем новичок в этой теме обещаний. Но я думаю, вам нужно решить проблему с помощью argData в readFromFileCallback.

Комментарии:

1. Это помогло. Во-вторых, я должен был использовать argPromise , а не argPromise.data . Это тоже помогло. Спасибо.

Ответ №2:

Вы можете читать и записывать с помощью fs.Обещания (начиная с 10.0, доступные по умолчанию). Пример

 const fs = require("fs");

async function writeInput(message) {
  try {
    await fs.promises.writeFile("new.txt", message, "utf8");
    console.log("well done");
  } catch (err) {
    console.log(err);
  }
}

writeInput("Put your args data here");

async function readInput() {
    const secret = await fs.promises.readFile("new.txt","utf8");
    console.log(secret);
  }
  
  readInput();
  

Вывод

 well done
Put your args data here
  

Комментарии:

1. Спасибо. С помощью await и async это уже решено. Я хочу решить эту проблему, используя только обещания, не ожидая асинхронности.