Можно ли обещать функции с помощью собственного кода в node.js? [Дубликат]

Если вы хотите быстро сканировать входные данные, не запутавшись в методе nextLine () класса Scanner, используйте для этого специальный сканер ввода.

Код:

class ScanReader {
/**
* @author Nikunj Khokhar
*/
    private byte[] buf = new byte[4 * 1024];
    private int index;
    private BufferedInputStream in;
    private int total;

    public ScanReader(InputStream inputStream) {
        in = new BufferedInputStream(inputStream);
    }

    private int scan() throws IOException {
        if (index >= total) {
            index = 0;
            total = in.read(buf);
            if (total <= 0) return -1;
        }
        return buf[index++];
    }
    public char scanChar(){
        int c=scan();
        while (isWhiteSpace(c))c=scan();
        return (char)c;
    }


    public int scanInt() throws IOException {
        int integer = 0;
        int n = scan();
        while (isWhiteSpace(n)) n = scan();
        int neg = 1;
        if (n == '-') {
            neg = -1;
            n = scan();
        }
        while (!isWhiteSpace(n)) {
            if (n >= '0' && n <= '9') {
                integer *= 10;
                integer += n - '0';
                n = scan();
            }
        }
        return neg * integer;
    }

    public String scanString() throws IOException {
        int c = scan();
        while (isWhiteSpace(c)) c = scan();
        StringBuilder res = new StringBuilder();
        do {
            res.appendCodePoint(c);
            c = scan();
        } while (!isWhiteSpace(c));
        return res.toString();
    }

    private boolean isWhiteSpace(int n) {
        if (n == ' ' || n == '\n' || n == '\r' || n == '\t' || n == -1) return true;
        else return false;
    }

    public long scanLong() throws IOException {
        long integer = 0;
        int n = scan();
        while (isWhiteSpace(n)) n = scan();
        int neg = 1;
        if (n == '-') {
            neg = -1;
            n = scan();
        }
        while (!isWhiteSpace(n)) {
            if (n >= '0' && n <= '9') {
                integer *= 10;
                integer += n - '0';
                n = scan();
            }
        }
        return neg * integer;
    }

    public void scanLong(long[] A) throws IOException {
        for (int i = 0; i < A.length; i++) A[i] = scanLong();
    }

    public void scanInt(int[] A) throws IOException {
        for (int i = 0; i < A.length; i++) A[i] = scanInt();
    }

    public double scanDouble() throws IOException {
        int c = scan();
        while (isWhiteSpace(c)) c = scan();
        int sgn = 1;
        if (c == '-') {
            sgn = -1;
            c = scan();
        }
        double res = 0;
        while (!isWhiteSpace(c) && c != '.') {
            if (c == 'e' || c == 'E') {
                return res * Math.pow(10, scanInt());
            }
            res *= 10;
            res += c - '0';
            c = scan();
        }
        if (c == '.') {
            c = scan();
            double m = 1;
            while (!isWhiteSpace(c)) {
                if (c == 'e' || c == 'E') {
                    return res * Math.pow(10, scanInt());
                }
                m /= 10;
                res += (c - '0') * m;
                c = scan();
            }
        }
        return res * sgn;
    }

}

Преимущества:

  • Сканирование Вход быстрее, чем BufferReader
  • Уменьшает сложность времени
  • Сбрасывает буфер для каждого следующего входа

Методы:

  • scanChar () - сканирование одиночного символа
  • scanInt () - scan Integer value
  • scanLong () - scan Длительное значение
  • scanString () - сканирование Строковое значение
  • scanDouble () - сканирование Двойное значение
  • scanInt (int [] array) - сканирует полный массив Array (Integer)
  • scanLong (long [] array) - сканирует полный массив (длинный)

Использование:

  1. Скопируйте данный код ниже вашего java-кода.
  2. Инициализировать объект для данного класса

ScanReader sc = new ScanReader(System.in); 3. Импортировать необходимые классы :

import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; 4. Выбросить IOException из вашего основного метода для обработки исключения 5. Использовать предоставленные методы. 6. Наслаждайтесь

Пример:

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
class Main{
    public static void main(String... as) throws IOException{
        ScanReader sc = new ScanReader(System.in);
        int a=sc.scanInt();
        System.out.println(a);
    }
}
class ScanReader....
9
задан user2864740 10 September 2015 в 19:54
поделиться

2 ответа

Это просто очень распространенная проблема вызова «несвязанных» методов . Вы можете передать контекст в качестве опции Promise.promisify , чтобы связать его:

var getNotifications = Promise.promisify(adapter.getNotifications, {context: adapter});

. Кроме того, вам нужно будет .bind() использовать этот метод или вызвать новая функция getNotifications на adapter (используя .call()). Вы также можете использовать Promise.promisifyAll(adapater), а затем просто позвонить adapter.getNotificationsAsync(…).

Обратите внимание, что это все еще не работает. Вы не можете просто создавать обещания в цикле - вам нужно их явно ждать и возвращать обещание от обратного вызова then, иначе только возвращаемое вами значение undefined будет немедленно передано на следующий обратный вызов.

adapter.getUsers().then(function(users) {
    return Promise.all(users.rows.map(function(item){
        var dbUser = "sigalei/" + item.value.name;
        console.log(dbUser);
        return getNotifications(dbUser);
    }));
}).then(function(results) {
    for (var i=0; i<results.length; i++)
        console.log("result:", results[i]);
});

Вместо Promise.all(users.rows.map(…)), в Bluebird вы также можете использовать Promise.map(users.rows, …).

6
ответ дан Community 23 August 2018 в 22:25
поделиться

Как насчет просто

var getNotifications = Promise.promisify(adapter.getNotifications.bind(adapter));

или, возможно,

var getNotifications = Promise.promisify(function () {
    return adapter.getNotifications.apply(adapter, arguments);
});

?

Я не уверен, что хорошо понимаю вашу проблему, но это должно убедитесь, что this привязан, а не undefined, когда вы делаете return getNotifications(dbUser);

1
ответ дан jrsala 23 August 2018 в 22:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: